<!doctype html>
<html>
<head>
<meta charset='UTF-8'><meta name='viewport' content='width=device-width initial-scale=1'>
<title>VLOOK 快速参考手册</title><style type='text/css'>html {overflow-x: initial !important;}:root { --node-fill:  #ECECFF; --node-border:  #CCCCFF; --cluster-fill:  #ffffde; --cluster-border:  #aaaa33; --note-fill:  #fff5ad; --note-border:  #aaaa33; --mermaid-color:  var(--text-color); }
.label { font-family: var(--mermaid-font-family); color: rgb(51, 51, 51); }
.label text { fill: rgb(51, 51, 51); }
.node rect, .node circle, .node ellipse, .node polygon { fill: var(--node-fill); stroke: rgb(147, 112, 219); stroke-width: 1px; }
.node .label { text-align: center; }
.node.clickable { cursor: pointer; }
.arrowheadPath { fill: var(--text-color); }
.edgePath .path { stroke: var(--text-color); stroke-width: 1.5px; }
.edgeLabel { background-color: rgb(232, 232, 232); text-align: center; }
.cluster rect { fill: var(--cluster-fill); stroke: var(--cluster-border); stroke-width: 1px; }
.cluster text { fill: var(--text-color); }
div.mermaidTooltip { position: absolute; text-align: center; max-width: 200px; padding: 2px; font-family: var(--mermaid-font-family); font-size: 12px; background: var(--cluster-fill); border: 1px solid var(--cluster-border); border-top-left-radius: 2px; border-top-right-radius: 2px; border-bottom-right-radius: 2px; border-bottom-left-radius: 2px; pointer-events: none; z-index: 100; }
.actor { stroke: var(--node-border); fill: var(--node-fill); }
text.actor { fill: black; stroke: none; }
.actor-line { stroke: grey; }
.messageLine0 { stroke-width: 1.5px; stroke: var(--text-color); }
.messageLine1 { stroke-width: 1.5px; stroke: var(--text-color); }
#arrowhead { fill: var(--text-color); }
.sequenceNumber { fill: white; }
#sequencenumber { fill: var(--text-color); }
#crosshead path { fill: var(--text-color)  !important; stroke: var(--text-color)  !important; }
.messageText { fill: var(--text-color); stroke: none; }
.labelBox { stroke: var(--node-border); fill: var(--node-fill); }
.labelText { fill: black; stroke: none; }
.loopText { fill: black; stroke: none; }
.loopLine { stroke-width: 2px; stroke: var(--node-border); }
.note { stroke: var(--cluster-border); fill: rgb(255, 245, 173); }
.noteText { fill: black; stroke: none; font-family: var(--mermaid-font-family); font-size: 14px; }
.activation0 { fill: rgb(244, 244, 244); stroke: rgb(102, 102, 102); }
.activation1 { fill: rgb(244, 244, 244); stroke: rgb(102, 102, 102); }
.activation2 { fill: rgb(244, 244, 244); stroke: rgb(102, 102, 102); }
.mermaid-main-font { font-family: var(--mermaid-font-family); }
.section { stroke: none; opacity: 0.2; }
.section0 { fill: rgba(102, 102, 255, 0.49); }
.section2 { fill: rgb(255, 244, 0); }
.section1, .section3 { fill: white; opacity: 0.2; }
.sectionTitle0 { fill: var(--text-color); }
.sectionTitle1 { fill: var(--text-color); }
.sectionTitle2 { fill: var(--text-color); }
.sectionTitle3 { fill: var(--text-color); }
.sectionTitle { text-anchor: start; font-size: 11px; font-family: var(--mermaid-font-family); }
.grid .tick { stroke: lightgrey; opacity: 0.3; shape-rendering: crispedges; }
.grid .tick text { font-family: var(--mermaid-font-family); }
.grid path { stroke-width: 0px; }
.today { fill: none; stroke: red; stroke-width: 2px; }
.task { stroke-width: 2px; }
.taskText { text-anchor: middle; font-family: var(--mermaid-font-family); }
.taskText:not([font-size]) { font-size: 11px; }
.taskTextOutsideRight { fill: black; text-anchor: start; font-size: 11px; font-family: var(--mermaid-font-family); }
.taskTextOutsideLeft { fill: black; text-anchor: end; font-size: 11px; }
.task.clickable { cursor: pointer; }
.taskText.clickable { cursor: pointer; font-weight: bold; fill: rgb(0, 49, 99) !important; }
.taskTextOutsideLeft.clickable { cursor: pointer; font-weight: bold; fill: rgb(0, 49, 99) !important; }
.taskTextOutsideRight.clickable { cursor: pointer; font-weight: bold; fill: rgb(0, 49, 99) !important; }
.taskText0, .taskText1, .taskText2, .taskText3 { fill: white; }
.task0, .task1, .task2, .task3 { fill: rgb(138, 144, 221); stroke: rgb(83, 79, 188); }
.taskTextOutside0, .taskTextOutside2 { fill: black; }
.taskTextOutside1, .taskTextOutside3 { fill: black; }
.active0, .active1, .active2, .active3 { fill: rgb(191, 199, 255); stroke: rgb(83, 79, 188); }
.activeText0, .activeText1, .activeText2, .activeText3 { fill: black !important; }
.done0, .done1, .done2, .done3 { stroke: grey; fill: lightgrey; stroke-width: 2px; }
.doneText0, .doneText1, .doneText2, .doneText3 { fill: black !important; }
.crit0, .crit1, .crit2, .crit3 { stroke: rgb(255, 136, 136); fill: red; stroke-width: 2px; }
.activeCrit0, .activeCrit1, .activeCrit2, .activeCrit3 { stroke: rgb(255, 136, 136); fill: rgb(191, 199, 255); stroke-width: 2px; }
.doneCrit0, .doneCrit1, .doneCrit2, .doneCrit3 { stroke: rgb(255, 136, 136); fill: lightgrey; stroke-width: 2px; cursor: pointer; shape-rendering: crispedges; }
.milestone { transform: rotate(45deg) scale(0.8, 0.8); }
.milestoneText { font-style: italic; }
.doneCritText0, .doneCritText1, .doneCritText2, .doneCritText3 { fill: black !important; }
.activeCritText0, .activeCritText1, .activeCritText2, .activeCritText3 { fill: black !important; }
.titleText { text-anchor: middle; font-size: 18px; fill: black; font-family: var(--mermaid-font-family); }
g.classGroup text { fill: rgb(147, 112, 219); stroke: none; font-family: var(--mermaid-font-family); font-size: 10px; }
g.classGroup text .title { font-weight: bolder; }
g.classGroup rect { fill: var(--node-fill); stroke: rgb(147, 112, 219); }
g.classGroup line { stroke: rgb(147, 112, 219); stroke-width: 1px; }
.classLabel .box { stroke: none; stroke-width: 0px; fill: var(--node-fill); opacity: 0.5; }
.classLabel .label { fill: rgb(147, 112, 219); font-size: 10px; }
.relation { stroke: rgb(147, 112, 219); stroke-width: 1px; fill: none; }
#compositionStart { fill: rgb(147, 112, 219); stroke: rgb(147, 112, 219); stroke-width: 1px; }
#compositionEnd { fill: rgb(147, 112, 219); stroke: rgb(147, 112, 219); stroke-width: 1px; }
#aggregationStart { fill: var(--node-fill); stroke: rgb(147, 112, 219); stroke-width: 1px; }
#aggregationEnd { fill: var(--node-fill); stroke: rgb(147, 112, 219); stroke-width: 1px; }
#dependencyStart { fill: rgb(147, 112, 219); stroke: rgb(147, 112, 219); stroke-width: 1px; }
#dependencyEnd { fill: rgb(147, 112, 219); stroke: rgb(147, 112, 219); stroke-width: 1px; }
#extensionStart { fill: rgb(147, 112, 219); stroke: rgb(147, 112, 219); stroke-width: 1px; }
#extensionEnd { fill: rgb(147, 112, 219); stroke: rgb(147, 112, 219); stroke-width: 1px; }
.commit-id, .commit-msg, .branch-label { fill: lightgrey; color: lightgrey; font-family: var(--mermaid-font-family); }
.pieTitleText { text-anchor: middle; font-size: 25px; fill: var(--text-color); font-family: var(--mermaid-font-family); }
.slice { font-family: var(--mermaid-font-family); }
g.stateGroup text { fill: rgb(147, 112, 219); stroke: none; font-size: 10px; font-family: var(--mermaid-font-family); }
g.stateGroup text { fill: rgb(147, 112, 219); stroke: none; font-size: 10px; }
g.stateGroup .state-title { font-weight: bolder; fill: black; }
g.stateGroup rect { fill: var(--node-fill); stroke: rgb(147, 112, 219); }
g.stateGroup line { stroke: rgb(147, 112, 219); stroke-width: 1px; }
.transition { stroke: rgb(147, 112, 219); stroke-width: 1px; fill: none; }
.stateGroup .composit { fill: white; border-bottom-width: 1px; }
.state-note { stroke: var(--cluster-border); fill: rgb(255, 245, 173); }
.state-note text { fill: black; stroke: none; font-size: 10px; }
.stateLabel .box { stroke: none; stroke-width: 0px; fill: var(--node-fill); opacity: 0.5; }
.stateLabel text { fill: black; font-size: 10px; font-weight: bold; font-family: var(--mermaid-font-family); }
.node text { font-size: 14px; }
div.mermaidTooltip { position: absolute; text-align: center; max-width: 200px; padding: 2px; font-family: var(--mermaid-font-family); font-size: 12px; background: var(--cluster-fill); border: 1px solid var(--cluster-border); border-top-left-radius: 2px; border-top-right-radius: 2px; border-bottom-right-radius: 2px; border-bottom-left-radius: 2px; pointer-events: none; z-index: 100; }
#write .md-diagram-panel .md-diagram-panel-preview div { }


:root { --bg-color: #ffffff; --text-color: #333333; --select-text-bg-color: #B5D6FC; --select-text-font-color: auto; --monospace: "Lucida Console",Consolas,"Courier",monospace; }
html { font-size: 14px; background-color: var(--bg-color); color: var(--text-color); font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; -webkit-font-smoothing: antialiased; }
body { margin: 0px; padding: 0px; height: auto; bottom: 0px; top: 0px; left: 0px; right: 0px; font-size: 1rem; line-height: 1.42857143; overflow-x: hidden; background-image: inherit; background-size: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: inherit; tab-size: 4; background-position: inherit inherit; background-repeat: inherit inherit; }
iframe { margin: auto; }
a.url { word-break: break-all; }
a:active, a:hover { outline: 0px; }
.in-text-selection, ::selection { text-shadow: none; background: var(--select-text-bg-color); color: var(--select-text-font-color); }
#write { margin: 0px auto; height: auto; width: inherit; word-break: normal; word-wrap: break-word; position: relative; white-space: normal; overflow-x: visible; padding-top: 40px; }
#write.first-line-indent p { text-indent: 2em; }
#write.first-line-indent li p, #write.first-line-indent p * { text-indent: 0px; }
#write.first-line-indent li { margin-left: 2em; }
.for-image #write { padding-left: 8px; padding-right: 8px; }
body.typora-export { padding-left: 30px; padding-right: 30px; }
.typora-export .footnote-line, .typora-export li, .typora-export p { white-space: pre-wrap; }
@media screen and (max-width: 500px) { 
  body.typora-export { padding-left: 0px; padding-right: 0px; }
  #write { padding-left: 20px; padding-right: 20px; }
  .CodeMirror-sizer { margin-left: 0px !important; }
  .CodeMirror-gutters { display: none !important; }
}
#write li > figure:last-child { margin-bottom: 0.5rem; }
#write ol, #write ul { position: relative; }
img { max-width: 100%; vertical-align: middle; image-orientation: from-image; }
button, input, select, textarea { color: inherit; font-family: inherit; font-size: inherit; font-style: inherit; font-variant-caps: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; }
input[type="checkbox"], input[type="radio"] { line-height: normal; padding: 0px; }
*, ::after, ::before { box-sizing: border-box; }
#write h1, #write h2, #write h3, #write h4, #write h5, #write h6, #write p, #write pre { width: inherit; }
#write h1, #write h2, #write h3, #write h4, #write h5, #write h6, #write p { position: relative; }
p { line-height: inherit; }
h1, h2, h3, h4, h5, h6 { break-after: avoid-page; break-inside: avoid; orphans: 4; }
p { orphans: 4; }
h1 { font-size: 2rem; }
h2 { font-size: 1.8rem; }
h3 { font-size: 1.6rem; }
h4 { font-size: 1.4rem; }
h5 { font-size: 1.2rem; }
h6 { font-size: 1rem; }
.md-math-block, .md-rawblock, h1, h2, h3, h4, h5, h6, p { margin-top: 1rem; margin-bottom: 1rem; }
.hidden { display: none; }
.md-blockmeta { color: rgb(204, 204, 204); font-weight: 700; font-style: italic; }
a { cursor: pointer; }
sup.md-footnote { padding: 2px 4px; background-color: rgba(238, 238, 238, 0.7); color: rgb(85, 85, 85); border-top-left-radius: 4px; border-top-right-radius: 4px; border-bottom-right-radius: 4px; border-bottom-left-radius: 4px; cursor: pointer; }
sup.md-footnote a, sup.md-footnote a:hover { color: inherit; text-transform: inherit; text-decoration: inherit; }
#write input[type="checkbox"] { cursor: pointer; width: inherit; height: inherit; }
figure { overflow-x: auto; margin: 1.2em 0px; max-width: calc(100% + 16px); padding: 0px; }
figure > table { margin: 0px !important; }
tr { break-inside: avoid; break-after: auto; }
thead { display: table-header-group; }
table { border-collapse: collapse; border-spacing: 0px; width: 100%; overflow: auto; break-inside: auto; text-align: left; }
table.md-table td { min-width: 32px; }
.CodeMirror-gutters { border-right-width: 0px; background-color: inherit; }
.CodeMirror-linenumber { }
.CodeMirror { text-align: left; }
.CodeMirror-placeholder { opacity: 0.3; }
.CodeMirror pre { padding: 0px 4px; }
.CodeMirror-lines { padding: 0px; }
div.hr:focus { cursor: none; }
#write pre { white-space: pre-wrap; }
#write.fences-no-line-wrapping pre { white-space: pre; }
#write pre.ty-contain-cm { white-space: normal; }
.CodeMirror-gutters { margin-right: 4px; }
.md-fences { font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; overflow: visible; white-space: pre; background-image: inherit; background-size: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: inherit; position: relative !important; background-position: inherit inherit; background-repeat: inherit inherit; }
.md-diagram-panel { width: 100%; margin-top: 10px; text-align: center; padding-top: 0px; padding-bottom: 8px; overflow-x: auto; }
#write .md-fences.mock-cm { white-space: pre-wrap; }
.md-fences.md-fences-with-lineno { padding-left: 0px; }
#write.fences-no-line-wrapping .md-fences.mock-cm { white-space: pre; overflow-x: auto; }
.md-fences.mock-cm.md-fences-with-lineno { padding-left: 8px; }
.CodeMirror-line, twitterwidget { break-inside: avoid; }
.footnotes { opacity: 0.8; font-size: 0.9rem; margin-top: 1em; margin-bottom: 1em; }
.footnotes + .footnotes { margin-top: 0px; }
.md-reset { margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: top; text-decoration: none; text-shadow: none; float: none; position: static; width: auto; height: auto; white-space: nowrap; cursor: inherit; line-height: normal; font-weight: 400; text-align: left; box-sizing: content-box; direction: ltr; background-position: 0px 0px; background-repeat: initial initial; }
li div { padding-top: 0px; }
blockquote { margin: 1rem 0px; }
li .mathjax-block, li p { margin: 0.5rem 0px; }
li { margin: 0px; position: relative; }
blockquote > :last-child { margin-bottom: 0px; }
blockquote > :first-child, li > :first-child { margin-top: 0px; }
.footnotes-area { color: rgb(136, 136, 136); margin-top: 0.714rem; padding-bottom: 0.143rem; white-space: normal; }
#write .footnote-line { white-space: pre-wrap; }
@media print { 
  body, html { border: 1px solid transparent; height: 99%; break-after: avoid; break-before: avoid; font-variant-ligatures: no-common-ligatures; }
  #write { margin-top: 0px; padding-top: 0px; border-color: transparent !important; }
  .typora-export * { -webkit-print-color-adjust: exact; }
  html.blink-to-pdf { font-size: 13px; }
  .typora-export #write { padding-left: 32px; padding-right: 32px; padding-bottom: 0px; break-after: avoid; }
  .typora-export #write::after { height: 0px; }
}
.footnote-line { margin-top: 0.714em; font-size: 0.7em; }
a img, img a { cursor: pointer; }
pre.md-meta-block { font-size: 0.8rem; min-height: 0.8rem; white-space: pre-wrap; background-color: rgb(204, 204, 204); display: block; overflow-x: hidden; background-position: initial initial; background-repeat: initial initial; }
p > .md-image:only-child:not(.md-img-error) img, p > img:only-child { display: block; margin: auto; }
#write.first-line-indent p > .md-image:only-child:not(.md-img-error) img { left: -2em; position: relative; }
p > .md-image:only-child { display: inline-block; width: 100%; }
#write .MathJax_Display { margin: 0.8em 0px 0px; }
.md-math-block { width: 100%; }
.md-math-block:not(:empty)::after { display: none; }
[contenteditable="true"]:active, [contenteditable="true"]:focus, [contenteditable="false"]:active, [contenteditable="false"]:focus { outline: 0px; box-shadow: none; }
.md-task-list-item { position: relative; list-style-type: none; }
.task-list-item.md-task-list-item { padding-left: 0px; }
.md-task-list-item > input { position: absolute; top: 0px; left: 0px; margin-left: -1.2em; margin-top: calc(1em - 10px); border: none; }
.math { font-size: 1rem; }
.md-toc { min-height: 3.58rem; position: relative; font-size: 0.9rem; border-top-left-radius: 10px; border-top-right-radius: 10px; border-bottom-right-radius: 10px; border-bottom-left-radius: 10px; }
.md-toc-content { position: relative; margin-left: 0px; }
.md-toc-content::after, .md-toc::after { display: none; }
.md-toc-item { display: block; color: rgb(65, 131, 196); }
.md-toc-item a { text-decoration: none; }
.md-toc-inner:hover { text-decoration: underline; }
.md-toc-inner { display: inline-block; cursor: pointer; }
.md-toc-h1 .md-toc-inner { margin-left: 0px; font-weight: 700; }
.md-toc-h2 .md-toc-inner { margin-left: 2em; }
.md-toc-h3 .md-toc-inner { margin-left: 4em; }
.md-toc-h4 .md-toc-inner { margin-left: 6em; }
.md-toc-h5 .md-toc-inner { margin-left: 8em; }
.md-toc-h6 .md-toc-inner { margin-left: 10em; }
@media screen and (max-width: 48em) { 
  .md-toc-h3 .md-toc-inner { margin-left: 3.5em; }
  .md-toc-h4 .md-toc-inner { margin-left: 5em; }
  .md-toc-h5 .md-toc-inner { margin-left: 6.5em; }
  .md-toc-h6 .md-toc-inner { margin-left: 8em; }
}
a.md-toc-inner { font-size: inherit; font-style: inherit; font-weight: inherit; line-height: inherit; }
.footnote-line a:not(.reversefootnote) { color: inherit; }
.md-attr { display: none; }
.md-fn-count::after { content: "."; }
code, pre, samp, tt { font-family: var(--monospace); }
kbd { margin: 0px 0.1em; padding: 0.1em 0.6em; font-size: 0.8em; color: rgb(36, 39, 41); background-color: rgb(255, 255, 255); border: 1px solid rgb(173, 179, 185); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; box-shadow: rgba(12, 13, 14, 0.2) 0px 1px 0px, rgb(255, 255, 255) 0px 0px 0px 2px inset; white-space: nowrap; vertical-align: middle; background-position: initial initial; background-repeat: initial initial; }
.md-comment { color: rgb(162, 127, 3); opacity: 0.8; font-family: var(--monospace); }
code { text-align: left; }
a.md-print-anchor { white-space: pre !important; border: none !important; display: inline-block !important; position: absolute !important; width: 1px !important; right: 0px !important; outline: 0px !important; text-shadow: initial !important; background-position: 0px 0px !important; background-repeat: initial initial !important; }
.md-inline-math .MathJax_SVG .noError { display: none !important; }
.html-for-mac .inline-math-svg .MathJax_SVG { vertical-align: 0.2px; }
.md-math-block .MathJax_SVG_Display { text-align: center; margin: 0px; position: relative; text-indent: 0px; max-width: none; max-height: none; min-height: 0px; min-width: 100%; width: auto; overflow-y: hidden; display: block !important; }
.MathJax_SVG_Display, .md-inline-math .MathJax_SVG_Display { width: auto; margin: inherit; display: inline-block !important; }
.MathJax_SVG .MJX-monospace { font-family: var(--monospace); }
.MathJax_SVG .MJX-sans-serif { font-family: sans-serif; }
.MathJax_SVG { display: inline; font-style: normal; font-weight: 400; line-height: normal; zoom: 90%; text-indent: 0px; text-align: left; text-transform: none; letter-spacing: normal; word-spacing: normal; word-wrap: normal; white-space: nowrap; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border: 0px; padding: 0px; margin: 0px; }
.MathJax_SVG * { transition: none; }
.MathJax_SVG_Display svg { vertical-align: middle !important; margin-bottom: 0px !important; margin-top: 0px !important; }
.os-windows.monocolor-emoji .md-emoji { font-family: "Segoe UI Symbol", sans-serif; }
.md-diagram-panel > svg { max-width: 100%; }
[lang="flow"] svg, [lang="mermaid"] svg { max-width: 100%; height: auto; }
[lang="mermaid"] .node text { font-size: 1rem; }
table tr th { border-bottom-width: 0px; }
video { max-width: 100%; display: block; margin: 0px auto; }
iframe { max-width: 100%; width: 100%; border: none; }
.highlight td, .highlight tr { border: 0px; }
svg[id^="mermaidChart"] { line-height: 1em; }
mark { background-color: rgb(255, 255, 0); color: rgb(0, 0, 0); background-position: initial initial; background-repeat: initial initial; }
.md-html-inline .md-plain, .md-html-inline strong, mark .md-inline-math, mark strong { color: inherit; }
mark .md-meta { color: rgb(0, 0, 0); opacity: 0.3 !important; }


.CodeMirror { height: auto; }
.CodeMirror.cm-s-inner { background-image: inherit; background-size: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: inherit; background-position: inherit inherit; background-repeat: inherit inherit; }
.CodeMirror-scroll { overflow: auto hidden; z-index: 3; }
.CodeMirror-gutter-filler, .CodeMirror-scrollbar-filler { background-color: rgb(255, 255, 255); }
.CodeMirror-gutters { border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); background-image: inherit; background-size: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: inherit; white-space: nowrap; background-position: inherit inherit; background-repeat: inherit inherit; }
.CodeMirror-linenumber { padding: 0px 3px 0px 5px; text-align: right; color: rgb(153, 153, 153); }
.cm-s-inner .cm-keyword { color: rgb(119, 0, 136); }
.cm-s-inner .cm-atom, .cm-s-inner.cm-atom { color: rgb(34, 17, 153); }
.cm-s-inner .cm-number { color: rgb(17, 102, 68); }
.cm-s-inner .cm-def { color: rgb(0, 0, 255); }
.cm-s-inner .cm-variable { color: rgb(0, 0, 0); }
.cm-s-inner .cm-variable-2 { color: rgb(0, 85, 170); }
.cm-s-inner .cm-variable-3 { color: rgb(0, 136, 85); }
.cm-s-inner .cm-string { color: rgb(170, 17, 17); }
.cm-s-inner .cm-property { color: rgb(0, 0, 0); }
.cm-s-inner .cm-operator { color: rgb(152, 26, 26); }
.cm-s-inner .cm-comment, .cm-s-inner.cm-comment { color: rgb(170, 85, 0); }
.cm-s-inner .cm-string-2 { color: rgb(255, 85, 0); }
.cm-s-inner .cm-meta { color: rgb(85, 85, 85); }
.cm-s-inner .cm-qualifier { color: rgb(85, 85, 85); }
.cm-s-inner .cm-builtin { color: rgb(51, 0, 170); }
.cm-s-inner .cm-bracket { color: rgb(153, 153, 119); }
.cm-s-inner .cm-tag { color: rgb(17, 119, 0); }
.cm-s-inner .cm-attribute { color: rgb(0, 0, 204); }
.cm-s-inner .cm-header, .cm-s-inner.cm-header { color: rgb(0, 0, 255); }
.cm-s-inner .cm-quote, .cm-s-inner.cm-quote { color: rgb(0, 153, 0); }
.cm-s-inner .cm-hr, .cm-s-inner.cm-hr { color: rgb(153, 153, 153); }
.cm-s-inner .cm-link, .cm-s-inner.cm-link { color: rgb(0, 0, 204); }
.cm-negative { color: rgb(221, 68, 68); }
.cm-positive { color: rgb(34, 153, 34); }
.cm-header, .cm-strong { font-weight: 700; }
.cm-del { text-decoration: line-through; }
.cm-em { font-style: italic; }
.cm-link { text-decoration: underline; }
.cm-error { color: red; }
.cm-invalidchar { color: red; }
.cm-constant { color: rgb(38, 139, 210); }
.cm-defined { color: rgb(181, 137, 0); }
div.CodeMirror span.CodeMirror-matchingbracket { color: rgb(0, 255, 0); }
div.CodeMirror span.CodeMirror-nonmatchingbracket { color: rgb(255, 34, 34); }
.cm-s-inner .CodeMirror-activeline-background { background-image: inherit; background-size: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: inherit; background-position: inherit inherit; background-repeat: inherit inherit; }
.CodeMirror { position: relative; overflow: hidden; }
.CodeMirror-scroll { height: 100%; outline: 0px; position: relative; box-sizing: content-box; background-image: inherit; background-size: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: inherit; background-position: inherit inherit; background-repeat: inherit inherit; }
.CodeMirror-sizer { position: relative; }
.CodeMirror-gutter-filler, .CodeMirror-hscrollbar, .CodeMirror-scrollbar-filler, .CodeMirror-vscrollbar { position: absolute; z-index: 6; display: none; }
.CodeMirror-vscrollbar { right: 0px; top: 0px; overflow: hidden; }
.CodeMirror-hscrollbar { bottom: 0px; left: 0px; overflow: hidden; }
.CodeMirror-scrollbar-filler { right: 0px; bottom: 0px; }
.CodeMirror-gutter-filler { left: 0px; bottom: 0px; }
.CodeMirror-gutters { position: absolute; left: 0px; top: 0px; padding-bottom: 30px; z-index: 3; }
.CodeMirror-gutter { white-space: normal; height: 100%; box-sizing: content-box; padding-bottom: 30px; margin-bottom: -32px; display: inline-block; }
.CodeMirror-gutter-wrapper { position: absolute; z-index: 4; border: none !important; background-position: 0px 0px !important; background-repeat: initial initial !important; }
.CodeMirror-gutter-background { position: absolute; top: 0px; bottom: 0px; z-index: 4; }
.CodeMirror-gutter-elt { position: absolute; cursor: default; z-index: 4; }
.CodeMirror-lines { cursor: text; }
.CodeMirror pre { border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; border-width: 0px; font-family: inherit; font-size: inherit; margin: 0px; white-space: pre; word-wrap: normal; color: inherit; z-index: 2; position: relative; overflow: visible; background-position: 0px 0px; background-repeat: initial initial; }
.CodeMirror-wrap pre { word-wrap: break-word; white-space: pre-wrap; word-break: normal; }
.CodeMirror-code pre { border-right-width: 30px; border-right-style: solid; border-right-color: transparent; width: fit-content; }
.CodeMirror-wrap .CodeMirror-code pre { border-right-style: none; width: auto; }
.CodeMirror-linebackground { position: absolute; left: 0px; right: 0px; top: 0px; bottom: 0px; z-index: 0; }
.CodeMirror-linewidget { position: relative; z-index: 2; overflow: auto; }
.CodeMirror-wrap .CodeMirror-scroll { overflow-x: hidden; }
.CodeMirror-measure { position: absolute; width: 100%; height: 0px; overflow: hidden; visibility: hidden; }
.CodeMirror-measure pre { position: static; }
.CodeMirror div.CodeMirror-cursor { position: absolute; visibility: hidden; border-right-style: none; width: 0px; }
.CodeMirror div.CodeMirror-cursor { visibility: hidden; }
.CodeMirror-focused div.CodeMirror-cursor { visibility: inherit; }
.cm-searching { background-color: rgba(255, 255, 0, 0.4); background-position: initial initial; background-repeat: initial initial; }
@media print { 
  .CodeMirror div.CodeMirror-cursor { visibility: hidden; }
}


/**************************************
* 字体主题
***************************************/
/**************************************
* 标准颜色
***************************************/
/**************************************
* 颜色主题
***************************************/
/**************************************
* VLOOK CSS 基础库
**************************************/
/**************************************
 自定义 UI 元素层叠次序

---------- 云顶 UI 区 ----------

欢迎屏 / .mdx-load-screen / z-index: 4000;
聚光灯 / .mdx-spotlight / z-index: 4000;

---------- 高优先信息 UI 区 -----

工具栏提示、弹窗提示 / .mdx-tool-tips, .mdx-info-tips / z-index: 3000;

---------- 二级 UI 区 ----------

插图导航 / .mdx-figure-nav / z-index: 2200;
脚注面板 / .mdx-footer-note-panel / z-index: 2100;
大纲面板 / .mdx-toc-panel / z-index: 2000;
    大纲面板头部 / .mdx-toc-panel-header / z-index: 10;
    大纲面板脚部 / .mdx-toc-panel-footer / z-index: 10;

---------- UI 间隔区 ----------

遮罩 / .mdx-mask / z-index: 1000;
mermaid 工具提示 / div.mermaidTooltip / z-index: 100;
？？ / .CodeMirror div.CodeMirror-cursor / z-index: 3;

---------- 增强工具操作区 ----------

工具栏 / .mdx-toolbar / z-index: 100;
逐章导航面板 / .mdx-chapter-nav / z-index: 100;

---------- 文档内容交互区 ----------

在新标签中打开按钮 / .mdx-btn-open-in-new-tab / z-index: 50;
复制代码块按钮 / .mdx-btn-copy-code-block / z-index: 50;
内容展开操作区 / .mdx-content-expander / z-index: 10;

**************************************/
:root {
  --vlook-theme-name: "VLOOK-Owl";
  --vlook-default-font-style: serif;
  --vlook-color-scheme: "light";
  --vlook-toc-box-width: 350px;
  --vlook-toc-box-left: -350px;
  --vlook-invert-in-dark-light: invert(0);
  --doc-bg-color-light: #FFFFFF;
  --doc-bg-color-alt-light: #e6e6e6;
  --doc-bg-color-transparent-light: rgba(255, 255, 255, 0);
  --doc-bg-color-alt-transparent-light: rgba(230, 230, 230, 0);
  --fore-color-light: #181A1E;
  --fore-color-alt-light: #737c8f;
  --tips-bg-color-light: #E0E2E6;
  --tips-bg-color-inset-light: #181A1E;
  --shadow-color-light: rgba(0, 0, 0, 0.1);
  --a-color-light: #181A1E;
  --table-color-light: #B0B2B6;
  --table-border-color-light: rgba(176, 178, 182, 0.8);
  --table-th-bg-color-light: rgba(176, 178, 182, 0.4);
  --table-th-border-color-light: rgba(176, 178, 182, 0.8);
  --del-color-light: #737c8f;
  --toc-header-num-color-light: rgba(24, 26, 30, 0.5);
  --header-color-light: #00A8BE;
  --header-box-shadow-light: rgba(0, 168, 190, 0.2);
  --header-bg-start-color-light: rgba(0, 168, 190, 0);
  --header-bg-end-color-light: rgba(0, 168, 190, 0.1);
  --code-bg-color-light: #c8f9ff;
  --code-name-bg-color-light: #181A1E;
  --code-name-shadow-color-light: #181A1E;
  --accent-color1-light: #0972DB;
  --accent-color2-light: #22A892;
  --accent-color3-light: #E68D09;
  --accent-color4-light: #C7285D;
  --accent-color5-light: #7536B3;
  --accent-color6-light: #585A5D;
  --mermaid-accent-color1-light: #0972DB;
  --mermaid-accent-color1-alt-light: #b4d8fc;
  --mermaid-accent-color2-light: #22A892;
  --mermaid-accent-color2-alt-light: #a9ede2;
  --mermaid-accent-color3-light: #E68D09;
  --mermaid-accent-color3-alt-light: #fce4bf;
  --mermaid-accent-color4-light: #C7285D;
  --mermaid-accent-color4-alt-light: #f4c7d6;
  --mermaid-accent-color5-light: #7536B3;
  --mermaid-accent-color5-alt-light: #dbc7ee;
  --mermaid-accent-color6-light: #585A5D;
  --mermaid-accent-color6-alt-light: #bfc0c2;
  --cm-keyword-light: #770088;
  --cm-variable-light: #181A1E;
  --cm-variable-2-light: #0055AA;
  --cm-variable-3-light: #008855;
  --cm-tag-light: #117700;
  --cm-attribute-light: #0000CC;
  --cm-CodeMirror-cursor-light: #737c8f;
  --cm-string-light: #AA1111;
  --cm-string-2-light: #FF5500;
  --cm-comment-light: #AA5500;
  --cm-header-light: #0000FF;
  --cm-quote-light: #009900;
  --cm-hr-light: #999999;
  --cm-link-light: #0000CC;
  --cm-negative-light: #DD4444;
  --cm-positive-light: #229922;
  --cm-meta-light: #555555;
  --cm-bulidin-light: #3300AA;
  --cm-bracket-light: #999977;
  --cm-atom-light: #221199;
  --cm-number-light: #116644;
  --vlook-invert-in-dark-dark: invert(1);
  --doc-bg-color-dark: #181A1E;
  --doc-bg-color-alt-dark: #3a3f49;
  --doc-bg-color-transparent-dark: rgba(24, 26, 30, 0);
  --doc-bg-color-alt-transparent-dark: rgba(58, 63, 73, 0);
  --fore-color-dark: #E0E2E6;
  --fore-color-alt-dark: #8b93a2;
  --tips-bg-color-dark: #3a3f49;
  --tips-bg-color-inset-dark: #E0E2E6;
  --shadow-color-dark: rgba(255, 255, 255, 0.1);
  --a-color-dark: #FFFFFF;
  --table-color-dark: #505256;
  --table-border-color-dark: rgba(80, 82, 86, 0.8);
  --table-th-bg-color-dark: rgba(80, 82, 86, 0.3);
  --table-th-border-color-dark: rgba(80, 82, 86, 0.8);
  --del-color-dark: #a8adb8;
  --toc-header-num-color-dark: rgba(224, 226, 230, 0.5);
  --header-color-dark: #00A8BE;
  --header-box-shadow-dark: rgba(0, 168, 190, 0.2);
  --header-bg-start-color-dark: rgba(0, 168, 190, 0);
  --header-bg-end-color-dark: rgba(0, 168, 190, 0.15);
  --code-bg-color-dark: #00454e;
  --code-name-bg-color-dark: #181A1E;
  --code-name-shadow-color-dark: #737c8f;
  --accent-color1-dark: #053f79;
  --accent-color2-dark: #115348;
  --accent-color3-dark: #845105;
  --accent-color4-dark: #721735;
  --accent-color5-dark: #421e65;
  --accent-color6-dark: #262729;
  --mermaid-accent-color1-dark: #0972db;
  --mermaid-accent-color1-alt-dark: #053f79;
  --mermaid-accent-color2-dark: #22a892;
  --mermaid-accent-color2-alt-dark: #115348;
  --mermaid-accent-color3-dark: #e68d09;
  --mermaid-accent-color3-alt-dark: #845105;
  --mermaid-accent-color4-dark: #c7285d;
  --mermaid-accent-color4-alt-dark: #721735;
  --mermaid-accent-color5-dark: #7536b3;
  --mermaid-accent-color5-alt-dark: #421e65;
  --mermaid-accent-color6-dark: #585a5d;
  --mermaid-accent-color6-alt-dark: #262729;
  --cm-keyword-dark: #C88FD0;
  --cm-variable-dark: #E0E2E6;
  --cm-variable-2-dark: #9FBAD5;
  --cm-variable-3-dark: #1CC685;
  --cm-tag-dark: #7DF46A;
  --cm-attribute-dark: #7575E4;
  --cm-CodeMirror-cursor-dark: #8b93a2;
  --cm-string-dark: #D26B6B;
  --cm-string-2-dark: #FF5500;
  --cm-comment-dark: #DA924A;
  --cm-header-dark: #8D8DF0;
  --cm-quote-dark: #57AC57;
  --cm-hr-dark: #D8D5D5;
  --cm-link-dark: #D3D3EF;
  --cm-negative-dark: #D95050;
  --cm-positive-dark: #50E650;
  --cm-meta-dark: #B7B3B3;
  --cm-bulidin-dark: #F3B3F8;
  --cm-bracket-dark: #999977;
  --cm-atom-dark: #84B6CB;
  --cm-number-dark: #64AB8F;
  --vlook-invert-in-dark: var(--vlook-invert-in-dark-light);
  --doc-bg-color: var(--doc-bg-color-light);
  --doc-bg-color-alt: var(--doc-bg-color-alt-light);
  --doc-bg-color-transparent: var(--doc-bg-color-transparent-light);
  --doc-bg-color-alt-transparent: var(--doc-bg-color-alt-transparent-light);
  --fore-color: var(--fore-color-light);
  --fore-color-alt: var(--fore-color-alt-light);
  --tips-bg-color: var(--tips-bg-color-light);
  --tips-bg-color-inset: var(--tips-bg-color-inset-light);
  --shadow-color: var(--shadow-color-light);
  --a-color: var(--a-color-light);
  --table-color: var(--table-color-light);
  --table-border-color: var(--table-border-color-light);
  --table-th-bg-color: var(--table-th-bg-color-light);
  --table-th-border-color: var(--table-th-border-color-light);
  --del-color: var(--del-color-light);
  --toc-header-num-color: var(--toc-header-num-color-light);
  --header-color: var(--header-color-light);
  --header-box-shadow: var(--header-box-shadow-light);
  --header-bg-start-color: var(--header-bg-start-color-light);
  --header-bg-end-color: var(--header-bg-end-color-light);
  --code-bg-color: var(--code-bg-color-light);
  --code-name-bg-color: var(--code-name-bg-color-light);
  --code-name-shadow-color: var(--code-name-bg-color);
  --accent-color1: var(--accent-color1-light);
  --accent-color2: var(--accent-color2-light);
  --accent-color3: var(--accent-color3-light);
  --accent-color4: var(--accent-color4-light);
  --accent-color5: var(--accent-color5-light);
  --accent-color6: var(--accent-color6-light);
  --mermaid-accent-color1: var(--mermaid-accent-color1-light);
  --mermaid-accent-color1-alt: var(--mermaid-accent-color1-alt-light);
  --mermaid-accent-color2: var(--mermaid-accent-color2-light);
  --mermaid-accent-color2-alt: var(--mermaid-accent-color2-alt-light);
  --mermaid-accent-color3: var(--mermaid-accent-color3-light);
  --mermaid-accent-color3-alt: var(--mermaid-accent-color3-alt-light);
  --mermaid-accent-color4: var(--mermaid-accent-color4-light);
  --mermaid-accent-color4-alt: var(--mermaid-accent-color4-alt-light);
  --mermaid-accent-color5: var(--mermaid-accent-color5-light);
  --mermaid-accent-color5-alt: var(--mermaid-accent-color5-alt-light);
  --mermaid-accent-color6: var(--mermaid-accent-color6-light);
  --mermaid-accent-color6-alt: var(--mermaid-accent-color6-alt-light);
  --cm-keyword: var(--cm-keyword-light);
  --cm-variable: var(--cm-variable-light);
  --cm-variable-2: var(--cm-variable-2-light);
  --cm-variable-3: var(--cm-variable-3-light);
  --cm-tag: var(--cm-tag-light);
  --cm-attribute: var(--cm-attribute-light);
  --cm-CodeMirror-cursor: var(--cm-CodeMirror-cursor-light);
  --cm-string: var(--cm-string-light);
  --cm-string-2: var(--cm-string-2-light);
  --cm-comment: var(--cm-comment-light);
  --cm-header: var(--cm-header-light);
  --cm-quote: var(--cm-quote-light);
  --cm-hr: var(--cm-hr-light);
  --cm-link: var(--cm-link-light);
  --cm-negative: var(--cm-negative-light);
  --cm-positive: var(--cm-positive-light);
  --cm-meta: var(--cm-meta-light);
  --cm-bulidin: var(--cm-bulidin-light);
  --cm-bracket: var(--cm-bracket-light);
  --cm-atom: var(--cm-atom-light);
  --cm-number: var(--cm-number-light);
}
html {
  font-size: 1em;
  cursor: default;
}
::selection {
  background: rgba(78, 75, 194, 0.3);
}
html,
body {
  background-color: var(--doc-bg-color);
  color: var(--fore-color);
  font-family: "Noto Serif CJK SC", "Times New Roman", Times, SimSun, "宋体", "Songti SC", "宋体-简", STZhongsong, "华文中宋", serif;
  font-weight: normal;
  line-height: 2;
  -webkit-tap-highlight-color: transparent;
}
body.typora-export {
  padding-left: 0;
  padding-right: 0;
}
body > *:first-child {
  margin-top: 0 !important;
}
body > *:last-child {
  margin-bottom: 0 !important;
}
img {
  margin: 0 !important;
}
img[src*="padding=true"] {
  padding: 10px !important;
}
img[src$=".wav"] {
  border: 10px solid #F00 !important;
  width: 200px !important;
  height: 50px !important;
  background-image: url("") !important;
}
audio {
  margin: 0 10px 0 10px;
  border-radius: 8px;
}
a {
  color: var(--a-color) !important;
  border-bottom: 2px solid #4E4BC2;
  font-family: "Noto Sans CJK SC", "PingFang SC", "苹方-简", "Helvetica Neue", Helvetica, Arial, Tahoma, SimHei, "黑体", "Heiti SC", "黑体-简", "Microsoft YaHei", "微软雅黑", sans-serif;
  text-decoration: none;
  margin-left: 0.1em;
  margin-right: 0.1em;
}
a:hover {
  color: #4E4BC2 !important;
  box-shadow: 0 -0.5em 0 0 rgba(78, 75, 194, 0.3) inset;
}
a:active {
  color: #706f9e !important;
  border-color: #706f9e;
}
a:not([name^="ref-footnote"]):hover::after {
  content: "🔗";
  margin-top: -0.7em;
  font-size: 0.7em;
  position: absolute;
}
a[href^="#"]:hover::after {
  content: "🔖";
}
h1,
h2,
h3,
h4,
h5,
h6 {
  color: var(--header-color);
  position: relative;
  margin: 1em 0 0.5em -0.2em;
  padding: 10px;
  line-height: 1.5;
  font-family: "Noto Serif CJK SC", "Noto Sans CJK SC", "PingFang SC", "苹方-简", "Helvetica Neue", Helvetica, Arial, Tahoma, SimHei, "黑体", "Heiti SC", "黑体-简", "Microsoft YaHei", "微软雅黑", sans-serif;
  font-weight: bold;
  border-radius: 16px 16px 0 0;
  background: linear-gradient(0deg, var(--header-bg-start-color), var(--header-bg-end-color));
}
h1 + ul,
h1 + ol,
h2 + ul,
h2 + ol,
h3 + ul,
h3 + ol,
h4 + ul,
h4 + ol,
h5 + ul,
h5 + ol,
h6 + ul,
h6 + ol {
  margin-top: 0;
}
h1 {
  margin-top: 5em;
  font-size: 2em;
  box-shadow: 0 3px 0 0 var(--header-box-shadow) inset;
}
h2 {
  margin-top: 4em;
  font-size: 1.8em;
  box-shadow: 0 2px 0 0 var(--header-box-shadow) inset;
}
h1 + h2 {
  box-shadow: none;
  background: none;
  margin-top: -0.5em;
}
h3 {
  margin-top: 3em;
  font-size: 1.6em;
  box-shadow: 0 1px 0 0 var(--header-box-shadow) inset;
}
h2 + h3 {
  box-shadow: none;
  background: none;
  margin-top: -0.5em;
}
h4 {
  margin-top: 2em;
  font-size: 1.4em;
  box-shadow: 0 1px 0 0 var(--header-box-shadow) inset;
}
h3 + h4 {
  box-shadow: none;
  background: none;
  margin-top: -0.5em;
}
h5 {
  font-size: 1.2em;
  box-shadow: 0 0 0 0 var(--header-box-shadow) inset;
}
h4 + h5 {
  box-shadow: none;
  background: none;
  margin-top: -0.5em;
}
h6 {
  margin-bottom: 0;
  padding-top: 0.5em;
  padding-bottom: 0.5em;
  font-family: "Noto Sans CJK SC", "PingFang SC", "苹方-简", "Helvetica Neue", Helvetica, Arial, Tahoma, SimHei, "黑体", "Heiti SC", "黑体-简", "Microsoft YaHei", "微软雅黑", sans-serif;
  font-size: 1.1em;
  box-shadow: none;
  background: none;
}
h1 + h6,
h2 + h6,
h3 + h6,
h4 + h6,
h5 + h6,
h6 + h6 {
  margin-top: 0;
  padding-top: 0;
}
li > h6 {
  color: var(--header-color);
  border-left: 0;
  padding-left: 0;
}
li > h6::before {
  content: "▪ ";
  color: rgba(0, 218, 216, 0.5);
}
strong {
  font-family: "Noto Sans CJK SC", "PingFang SC", "苹方-简", "Helvetica Neue", Helvetica, Arial, Tahoma, SimHei, "黑体", "Heiti SC", "黑体-简", "Microsoft YaHei", "微软雅黑", sans-serif;
  font-weight: bold;
}
hr {
  margin-top: 1.2em;
  margin-bottom: 1.2em;
  border: 1px solid #737c8f;
  overflow: hidden;
  box-sizing: content-box;
  border-top: 0;
}
body > div > h1:first-of-type {
  border-top: 0;
}
body > h2:first-child {
  margin-top: 0;
  padding-top: 0;
}
body > h1:first-child {
  margin-top: 0;
  padding-top: 0;
}
body > h1:first-child + h2 {
  margin-top: 0;
  padding-top: 0;
}
body > h3:first-child,
body > h4:first-child,
body > h5:first-child,
body > h6:first-child {
  margin-top: 0;
  padding-top: 0;
}
a:first-child > h1,
a:first-child > h2,
a:first-child > h3,
a:first-child > h4,
a:first-child > h5,
a:first-child > h6 {
  margin-top: 0;
  padding-top: 0;
}
ul > li,
ol > li,
p,
figure,
.md-diagram-panel {
  text-align: left;
  margin-top: 0;
}
figure {
  margin-bottom: 20px;
  border-radius: 16px;
}
ol > li,
ul > li {
  list-style-type: decimal;
}
ol > li > ul > li,
ul > li > ul > li {
  list-style-type: lower-alpha;
}
ol > li > ul > li > ul > li,
ul > li > ul > li > ul > li {
  list-style-type: disc;
}
ol > li > ul > li > ul > li > ul > li,
ul > li > ul > li > ul > li > ul > li {
  list-style-type: lower-roman;
}
ol > li > ul > li > ul > li > ul > li > ul > li,
ul > li > ul > li > ul > li > ul > li > ul > li {
  list-style-type: circle;
}
ol > li > ul > li > ul > li > ul > li > ul > li > ul > li,
ul > li > ul > li > ul > li > ul > li > ul > li > ul > li {
  list-style-type: square;
}
ul,
ol {
  padding-left: 2em;
  padding-bottom: 0;
}
blockquote {
  border: 1px solid rgba(34, 168, 146, 0.5);
  border-radius: 16px;
  padding: 0.5em;
  margin-top: 0;
  margin-bottom: 1em;
  color: var(--fore-color);
  background-color: rgba(34, 168, 146, 0.05);
}
blockquote > p {
  margin-bottom: 0;
}
blockquote > a {
  color: #22A892;
}
blockquote > ul,
blockquote > ol {
  margin-top: 0;
}
blockquote > blockquote {
  border: 1px solid rgba(34, 168, 146, 0.15);
  border-top-left-radius: 0;
}
blockquote > blockquote > blockquote {
  border-width: 2px;
}
blockquote > blockquote > blockquote > blockquote {
  border-width: 3px;
}
blockquote > strong {
  color: inherit !important;
}
table {
  border-collapse: inherit;
  border-spacing: 0;
  width: auto;
  line-height: 1.5;
  word-break: break-all;
  white-space: pre-wrap;
  border: 2px solid var(--table-border-color);
  border-radius: 16px;
  background-color: var(--doc-bg-color);
}
table > thead > tr {
  margin: 0;
  padding: 0;
}
table > thead > tr > th,
table > thead > tr > td {
  background-color: var(--table-th-bg-color);
  font-family: "Noto Sans CJK SC", "PingFang SC", "苹方-简", "Helvetica Neue", Helvetica, Arial, Tahoma, SimHei, "黑体", "Heiti SC", "黑体-简", "Microsoft YaHei", "微软雅黑", sans-serif;
  font-weight: bold;
  border-right: 1px solid rgba(176, 178, 182, 0.1);
  margin: 0;
  padding: 0.5em 0.5em;
  box-shadow: 0 1px 0 var(--table-th-border-color);
}
table > tbody > tr:not(:first-child) > td {
  box-shadow: 0 -1px 0 rgba(176, 178, 182, 0.2);
}
table > tbody > tr:nth-child(2n) {
  background-color: rgba(176, 178, 182, 0.1);
}
table > thead > tr:first-child > th:first-child {
  border-top-left-radius: 14px;
  white-space: pre;
}
table th:first-child,
table td:first-child {
  white-space: pre;
}
table > thead > tr:first-child > th:last-child {
  border-top-right-radius: 14px;
}
table > tbody > tr:last-child > td:first-child {
  border-bottom-left-radius: 14px;
}
table > tbody > tr:last-child > td:last-child {
  border-bottom-right-radius: 14px;
}
.mdx-table-column-format-bold {
  font-family: "Noto Sans CJK SC", "PingFang SC", "苹方-简", "Helvetica Neue", Helvetica, Arial, Tahoma, SimHei, "黑体", "Heiti SC", "黑体-简", "Microsoft YaHei", "微软雅黑", sans-serif;
  font-weight: bold;
}
.mdx-table-column-format-em {
  font-style: italic;
}
.mdx-table-column-format-underline {
  text-decoration: underline;
}
table tr > td {
  border-right: 1px solid rgba(176, 178, 182, 0.1);
  margin: 0;
  padding: 0.5em 0.5em;
}
table tr > th:first-child,
table tr > td:first-child {
  padding-left: 0.5em;
}
table tr > th:last-child,
table tr > td:last-child {
  border-right: 0;
  padding-right: 0.5em;
}
table tr:last-child > td {
  border-bottom: 0;
}
li > figure table,
h1 + figure table,
h2 + figure table,
h3 + figure table,
h4 + figure table,
h5 + figure table,
h6 + figure table {
  counter-reset: tableRowNumber - 1;
}
li > figure table tbody tr,
h1 + figure table tbody tr,
h2 + figure table tbody tr,
h3 + figure table tbody tr,
h4 + figure table tbody tr,
h5 + figure table tbody tr,
h6 + figure table tbody tr {
  counter-increment: tableRowNumber;
}
figure table tr > th:first-child::before,
figure table tr > td:first-child::before {
  content: "# ";
  color: var(--toc-header-num-color);
  font-family: "Fira Code", Menlo, Consolas, "Courier New", "Noto Sans CJK SC", SimHei, "黑体", "Heiti SC", "黑体-简", "Microsoft YaHei", "微软雅黑", monospace;
  font-weight: normal !important;
  font-size: 0.8em;
  vertical-align: middle;
  text-align: right;
  width: 2.5em;
  position: absolute;
  left: -2.5em;
}
li > figure table tbody tr > td:first-child::before {
  content: counter(tableRowNumber) " ";
}
.mdx-table-row-num-hidden::before {
  content: "" !important;
}
li > h6 + figure {
  margin-left: 0;
}
li h6 + figure table tr > th:first-child::before,
li h6 + figure table tr > td:first-child::before {
  left: -2.5em;
}
h1 + figure table tr > th:first-child::before,
h1 + figure table tr > td:first-child::before,
h2 + figure table tr > th:first-child::before,
h2 + figure table tr > td:first-child::before,
h3 + figure table tr > th:first-child::before,
h3 + figure table tr > td:first-child::before,
h4 + figure table tr > th:first-child::before,
h4 + figure table tr > td:first-child::before,
h5 + figure table tr > th:first-child::before,
h5 + figure table tr > td:first-child::before,
h6 + figure table tr > th:first-child::before,
h6 + figure table tr > td:first-child::before {
  left: 0.8em;
}
h1 + figure table tbody tr > td:first-child::before,
h2 + figure table tbody tr > td:first-child::before,
h3 + figure table tbody tr > td:first-child::before,
h4 + figure table tbody tr > td:first-child::before,
h5 + figure table tbody tr > td:first-child::before,
h6 + figure table tbody tr > td:first-child::before {
  content: counter(tableRowNumber) " ";
}
li > figure {
  margin-top: 0;
}
h1 + figure,
h2 + figure,
h3 + figure,
h4 + figure,
h5 + figure,
h6 + figure {
  margin-top: 0;
  margin-left: 2em;
}
.mdx-table-cross {
  width: 100px;
  height: 100px;
  position: absolute;
  display: none;
  pointer-events: none;
}
.mdx-table-cross-left {
  background: linear-gradient(90deg, rgba(78, 75, 194, 0.01), rgba(78, 75, 194, 0.3));
}
.mdx-table-cross-right {
  background: linear-gradient(90deg, rgba(78, 75, 194, 0.3), rgba(78, 75, 194, 0.01));
}
.mdx-table-cross-up {
  background: linear-gradient(0deg, rgba(78, 75, 194, 0.3), rgba(78, 75, 194, 0.01));
}
.mdx-table-cross-down {
  background: linear-gradient(0deg, rgba(78, 75, 194, 0.01), rgba(78, 75, 194, 0.3));
}
mark {
  background-color: rgba(255, 240, 0, 0.6) !important;
  border-radius: 0.3em;
  padding: 0 0.2em;
  margin: 0 0.1em;
  color: #000000;
}
mark mark {
  background: none !important;
}
del,
del strong {
  font-style: italic;
  color: var(--del-color) !important;
  text-decoration: line-through solid !important;
}
del code {
  font-style: italic;
  text-decoration: line-throug solid !important;
}
.footnotes-area {
  margin-top: 100px;
}
.footnote-line {
  font-size: 1em;
  margin-top: 0.5em;
  padding-bottom: 0.5em;
}
.mdx-footer-note-panel-content > .footnote-line {
  padding-bottom: 50px;
}
.md-fn-count {
  font-family: "Noto Sans CJK SC", "PingFang SC", "苹方-简", "Helvetica Neue", Helvetica, Arial, Tahoma, SimHei, "黑体", "Heiti SC", "黑体-简", "Microsoft YaHei", "微软雅黑", sans-serif;
}
.md-fn-count::before {
  content: "[";
}
.md-fn-count::after {
  content: "] ";
}
.reversefootnote {
  color: #0972DB;
}
.reversefootnote:hover {
  color: #C7285D;
}
a[name^="ref-footnote-"] {
  font-family: "Noto Sans CJK SC", "PingFang SC", "苹方-简", "Helvetica Neue", Helvetica, Arial, Tahoma, SimHei, "黑体", "Heiti SC", "黑体-简", "Microsoft YaHei", "微软雅黑", sans-serif;
  color: #0972DB;
}
a[name^="ref-footnote-"]:hover {
  color: #706f9e;
}
a[name^="ref-footnote-"]::before {
  content: "[";
}
a[name^="ref-footnote-"]::after {
  content: "] ";
}
.CodeMirror-gutters {
  border-width: 0;
  background-color: var(--doc-bg-color-alt);
  border-right: 1px solid var(--doc-bg-color-alt);
  height: 100% !important;
}
.CodeMirror-linenumber {
  color: #737c8f;
}
tt,
code {
  color: var(--fore-color);
  font-family: "Fira Code", Menlo, Consolas, "Courier New", "Noto Sans CJK SC", SimHei, "黑体", "Heiti SC", "黑体-简", "Microsoft YaHei", "微软雅黑", monospace;
  background-color: var(--code-bg-color);
  border-radius: 0.3em;
  padding: 0.1em 0.2em;
  margin: 0 0.1em;
  display: inline;
  white-space: pre;
}
.md-fences {
  color: var(--fore-color);
  font-family: "Fira Code", Menlo, Consolas, "Courier New", "Noto Sans CJK SC", SimHei, "黑体", "Heiti SC", "黑体-简", "Microsoft YaHei", "微软雅黑", monospace;
  border-radius: 16px;
  border: 2px solid var(--table-border-color);
  margin: 0;
}
.task-list {
  padding-left: 0;
}
.task-list-item {
  padding-left: 32px;
}
.task-list-item input {
  top: 3px;
  left: 8px;
}
#write pre.md-meta-block {
  padding: 1em;
  font-size: 85%;
  line-height: 2;
  background-color: rgba(24, 26, 30, 0.05);
  border: 0;
  border-radius: 3px;
  color: #181A1E;
  margin-top: 0 !important;
}
.mathjax-block > .code-tooltip {
  bottom: 0.375em;
}
.md-image > .md-meta {
  border: 1px solid rgba(176, 178, 182, 0.8);
  background-color: rgba(24, 26, 30, 0.05);
  border-radius: 3px;
  padding: 2px 4px 0 4px;
  color: inherit;
}
.md-tag {
  color: inherit;
}
#typora-quick-open {
  border: 1px solid rgba(176, 178, 182, 0.8);
  background-color: rgba(24, 26, 30, 0.05);
}
#typora-quick-open-item {
  background-color: rgba(24, 26, 30, 0.05);
  border-color: rgba(176, 178, 182, 0.8);
  border-style: solid;
  border-width: 1px;
}
#md-notification::before {
  top: 10px;
}
/** focus mode */
.on-focus-mode blockquote {
  border-left-color: #181A1E;
}
/**************************************
* Header Counters in TOC 目录中的标题序号样式
**************************************/
/* No link underlines in TOC */
.md-toc-content {
  counter-reset: h1toc;
}
.md-toc-h1 {
  margin-left: 0;
  padding-left: 10px;
  counter-reset: h2toc;
}
.md-toc-h2 {
  margin-left: 0;
  padding-left: 20px;
  counter-reset: h3toc;
}
.md-toc-h3 {
  margin-left: 0;
  padding-left: 30px;
  counter-reset: h4toc;
}
.md-toc-h4 {
  margin-left: 0;
  padding-left: 40px;
  counter-reset: h5toc;
}
.md-toc-h5 {
  margin-left: 0;
  padding-left: 50px;
  counter-reset: h6toc;
}
.md-toc-h6 {
  display: none;
  margin-left: 0;
  padding-left: 50px;
}
.md-toc-h1::before {
  counter-increment: h1toc;
  content: counter(h1toc) "  ";
}
.md-toc-h1 > .md-toc-inner {
  margin-left: 0;
}
.md-toc-h2::before {
  counter-increment: h2toc;
  content: counter(h1toc) "." counter(h2toc) "  ";
}
.md-toc-h2 > .md-toc-inner {
  margin-left: 0;
}
.md-toc-h3::before {
  counter-increment: h3toc;
  content: counter(h1toc) "." counter(h2toc) "." counter(h3toc) "  ";
}
.md-toc-h3 > .md-toc-inner {
  margin-left: 0;
}
.md-toc-h4::before {
  counter-increment: h4toc;
  content: counter(h1toc) "." counter(h2toc) "." counter(h3toc) "." counter(h4toc) "  ";
}
.md-toc-h4 > .md-toc-inner {
  margin-left: 0;
}
.md-toc-h5::before {
  counter-increment: h5toc;
  content: counter(h1toc) "." counter(h2toc) "." counter(h3toc) "." counter(h4toc) "." counter(h5toc) "  ";
}
.md-toc-h5 > .md-toc-inner {
  margin-left: 0;
}
/**************************************
* Header Counters in Content 内容中的目录序号样式
**************************************/
/** initialize css counter */
#write {
  counter-reset: h1;
}
h1 {
  counter-reset: h2;
}
h2 {
  counter-reset: h3;
}
h3 {
  counter-reset: h4;
}
h4 {
  counter-reset: h5;
}
#write h1::before,
#write h2::before,
#write h3::before,
#write h4::before,
#write h5::before,
#write h6::before {
  color: rgba(0, 218, 216, 0.5);
}
#write h1::before {
  counter-increment: h1;
  content: counter(h1) "  ";
}
#write h2::before {
  counter-increment: h2;
  content: counter(h1) "." counter(h2) "  ";
}
#write h3::before {
  /*override the default style for focused headings */
  counter-increment: h3;
  content: counter(h1) "." counter(h2) "." counter(h3) "  ";
}
#write h4::before {
  counter-increment: h4;
  content: counter(h1) "." counter(h2) "." counter(h3) "." counter(h4) "  ";
}
#write h5::before {
  counter-increment: h5;
  content: counter(h1) "." counter(h2) "." counter(h3) "." counter(h4) "." counter(h5) "  ";
}
#write h6::before {
  content: "◎ ";
}
/** override the default style for focused headings */
#write > h3.md-focus::before,
#write > h4.md-focus::before,
#write > h5.md-focus::before,
#write > h6.md-focus::before,
h3.md-focus::before,
h4.md-focus::before,
h5.md-focus::before,
h6.md-focus::before {
  border: inherit;
  position: inherit;
  left: inherit;
  float: none;
  top: initial;
  font-size: inherit;
  vertical-align: inherit;
  font-weight: inherit;
  line-height: inherit;
}
/**************************************
* Electron UI
**************************************/
.outline-item {
  line-height: 1;
  font-family: "Noto Sans CJK SC", "PingFang SC", "苹方-简", "Helvetica Neue", Helvetica, Arial, Tahoma, SimHei, "黑体", "Heiti SC", "黑体-简", "Microsoft YaHei", "微软雅黑", sans-serif;
}
/**************************************
* 脚本化画表 CSS
**************************************/
/* ----- flow diagram 流程图 ----- */
/**************************************
* mermaid CSS
**************************************/
/* ----- pie diagram 饼图 ----- */
.pieTitleText {
  fill: var(--fore-color);
  font-family: "Noto Sans CJK SC", "PingFang SC", "苹方-简", "Helvetica Neue", Helvetica, Arial, Tahoma, SimHei, "黑体", "Heiti SC", "黑体-简", "Microsoft YaHei", "微软雅黑", sans-serif;
  font-weight: bold;
  font-size: 1.5em;
}
.legend text {
  fill: var(--fore-color);
  font-family: "Noto Sans CJK SC", "PingFang SC", "苹方-简", "Helvetica Neue", Helvetica, Arial, Tahoma, SimHei, "黑体", "Heiti SC", "黑体-简", "Microsoft YaHei", "微软雅黑", sans-serif;
  font-weight: bold;
}
.slice {
  font-family: "Noto Sans CJK SC", "PingFang SC", "苹方-简", "Helvetica Neue", Helvetica, Arial, Tahoma, SimHei, "黑体", "Heiti SC", "黑体-简", "Microsoft YaHei", "微软雅黑", sans-serif;
  font-weight: bold;
}
/* ----- flow diagram 流程图 ----- */
.mermaid .label div,
.mdx-figure .label div {
  font-size: 0.8em !important;
}
svg[id^="mermaidChart"] {
  color: var(--fore-color);
}
.label div {
  color: var(--fore-color);
  font-family: "Noto Sans CJK SC", "PingFang SC", "苹方-简", "Helvetica Neue", Helvetica, Arial, Tahoma, SimHei, "黑体", "Heiti SC", "黑体-简", "Microsoft YaHei", "微软雅黑", sans-serif;
}
.node rect[rx="0"][ry="0"] {
  fill: var(--mermaid-accent-color1-alt) !important;
  stroke: var(--mermaid-accent-color1) !important;
  stroke-width: 5;
}
.node rect[rx="5"][ry="5"] {
  fill: var(--mermaid-accent-color1-alt) !important;
  stroke: var(--mermaid-accent-color1) !important;
  stroke-width: 1;
}
.node rect[rx="5"][ry="5"] {
  rx: 6 !important;
  ry: 6 !important;
}
.node circle {
  fill: var(--doc-bg-color);
  stroke: var(--mermaid-accent-color2);
  stroke-width: 2;
}
.node ellipse {
  color: var(--fore-color);
  fill: var(--fore-color-alt);
  stroke: var(--fore-color);
  stroke-width: 10;
}
.node polygon {
  fill: var(--mermaid-accent-color4-alt);
  stroke: var(--mermaid-accent-color4);
  stroke-width: 1;
}
.node[id^="page"] polygon {
  fill: var(--doc-bg-color);
  stroke: var(--mermaid-accent-color2);
  stroke-width: 2;
}
.node[id^="trans"] polygon {
  fill: var(--fore-color);
  stroke-width: 0;
}
.edgePath .path {
  stroke: var(--fore-color);
  stroke-width: 2;
}
.arrowheadPath {
  fill: var(--fore-color);
}
.edgeLabel .label span,
.edgeLabel {
  color: var(--fore-color);
  background-color: var(--doc-bg-color);
  font-weight: bold;
  line-height: 1em;
}
.edgeLabel div {
  background-color: var(--doc-bg-color);
}
.cluster rect {
  fill: var(--doc-bg-color-alt) !important;
  stroke: var(--fore-color) !important;
  stroke-width: 1 !important;
  stroke-dasharray: 3;
  rx: 15 !important;
  ry: 15 !important;
}
.cluster text {
  color: var(--fore-color);
  fill: var(--fore-color);
  font-family: "Noto Sans CJK SC", "PingFang SC", "苹方-简", "Helvetica Neue", Helvetica, Arial, Tahoma, SimHei, "黑体", "Heiti SC", "黑体-简", "Microsoft YaHei", "微软雅黑", sans-serif;
}
#START rect {
  fill: var(--fore-color) !important;
  stroke: var(--fore-color) !important;
  stroke-width: 5 !important;
  rx: 15 !important;
  ry: 15 !important;
}
#START rect + .label div {
  color: var(--doc-bg-color) !important;
}
#END rect {
  color: var(--fore-color) !important;
  fill: var(--doc-bg-color) !important;
  stroke: var(--fore-color) !important;
  stroke-width: 5 !important;
  rx: 15;
  ry: 15;
}
#INIT circle {
  fill: var(--fore-color) !important;
  stroke: var(--fore-color) !important;
  stroke-width: 0 !important;
}
#INIT .label div {
  color: var(--fore-color) !important;
}
#INIT ~ g > rect {
  fill: var(--mermaid-accent-color5-alt) !important;
  stroke: var(--mermaid-accent-color5) !important;
  stroke-width: 3;
  rx: 15 !important;
  ry: 15 !important;
  border-radius: 15px !important;
}
#FINAL circle {
  fill: none !important;
  stroke: var(--fore-color) !important;
  stroke-width: 5 !important;
}
/* ----- sequeuce diagram 时序图 ----- */
.actor {
  stroke: var(--mermaid-accent-color1);
  fill: var(--mermaid-accent-color1-alt);
  font-size: 1em !important;
  stroke-width: 1;
  rx: 6;
  ry: 6;
}
.actor-person {
  fill: var(--doc-bg-color);
}
.actor-key-sys {
  stroke-width: 3;
  font-weight: bold;
}
.actor-ext-sys {
  stroke-dasharray: 5 2;
}
text.actor {
  fill: var(--fore-color);
  stroke: none;
  font-size: 0.85em !important;
  font-family: "Noto Sans CJK SC", "PingFang SC", "苹方-简", "Helvetica Neue", Helvetica, Arial, Tahoma, SimHei, "黑体", "Heiti SC", "黑体-简", "Microsoft YaHei", "微软雅黑", sans-serif;
}
.actor-line {
  stroke: var(--mermaid-accent-color1);
  stroke-width: 1;
}
.messageLine0 {
  stroke-width: 2;
  stroke: var(--fore-color);
}
#arrowhead {
  fill: var(--fore-color);
}
.messageLine1 {
  stroke-width: 2;
  stroke: var(--fore-color);
}
#crosshead path {
  fill: var(--fore-color-alt) !important;
  stroke: var(--fore-color) !important;
}
.messageText {
  fill: var(--fore-color);
  stroke: none;
  font-size: 0.85em !important;
  font-family: "Noto Sans CJK SC", "PingFang SC", "苹方-简", "Helvetica Neue", Helvetica, Arial, Tahoma, SimHei, "黑体", "Heiti SC", "黑体-简", "Microsoft YaHei", "微软雅黑", sans-serif;
  font-weight: bold;
  line-height: 2em;
}
.activation0,
.activation1,
.activation2 {
  fill: var(--mermaid-accent-color1) !important;
  stroke-width: 0 !important;
}
.labelBox {
  stroke: none;
  fill: var(--mermaid-accent-color3-alt);
}
.labelText tspan {
  fill: var(--mermaid-accent-color3);
  font-size: 0.8em !important;
  font-weight: bold;
  font-family: "Noto Sans CJK SC", "PingFang SC", "苹方-简", "Helvetica Neue", Helvetica, Arial, Tahoma, SimHei, "黑体", "Heiti SC", "黑体-简", "Microsoft YaHei", "微软雅黑", sans-serif;
}
.loopText tspan {
  fill: var(--mermaid-accent-color3);
  font-size: 0.85em !important;
  font-family: "Noto Sans CJK SC", "PingFang SC", "苹方-简", "Helvetica Neue", Helvetica, Arial, Tahoma, SimHei, "黑体", "Heiti SC", "黑体-简", "Microsoft YaHei", "微软雅黑", sans-serif;
}
.loopLine {
  stroke-width: 1;
  stroke: var(--mermaid-accent-color3);
}
.note {
  stroke: var(--mermaid-accent-color2);
  stroke-dasharray: 2;
  fill: var(--mermaid-accent-color2-alt);
}
.noteText tspan {
  fill: var(--fore-color);
  stroke: none;
  font-size: 0.85em !important;
  font-family: "Noto Serif CJK SC", "Times New Roman", Times, SimSun, "宋体", "Songti SC", "宋体-简", STZhongsong, "华文中宋", serif;
}
/* ----- state diagram 状态机图 ----- */
g.stateGroup circle {
  fill: var(--fore-color) !important;
  stroke: var(--doc-bg-color) !important;
}
g.stateGroup rect,
g.stateGroup line {
  fill: var(--mermaid-accent-color1-alt) !important;
  stroke: var(--mermaid-accent-color1) !important;
}
g.stateGroup rect[height="7"] {
  fill: var(--fore-color) !important;
  stroke: none !important;
}
.transition {
  stroke: var(--fore-color) !important;
}
g.stateGroup .composit {
  fill: var(--doc-bg-color) !important;
}
g.stateGroup .state-title,
g.stateGroup text {
  fill: var(--fore-color) !important;
  font-family: "Noto Sans CJK SC", "PingFang SC", "苹方-简", "Helvetica Neue", Helvetica, Arial, Tahoma, SimHei, "黑体", "Heiti SC", "黑体-简", "Microsoft YaHei", "微软雅黑", sans-serif;
  font-size: 0.5em !important;
}
.stateLabel text {
  font-size: 0.5em;
}
g.state-note {
  fill: var(--mermaid-accent-color2-alt);
  stroke: var(--mermaid-accent-color2);
}
/* ----- class diagram 类图 ----- */
g.cardinality text,
g.classGroup text,
g.classLabel .label {
  font-family: "Fira Code", Menlo, Consolas, "Courier New", "Noto Sans CJK SC", SimHei, "黑体", "Heiti SC", "黑体-简", "Microsoft YaHei", "微软雅黑", monospace;
  fill: var(--fore-color);
  stroke: none;
}
g.classGroup rect {
  fill: var(--mermaid-accent-color1-alt);
  stroke: var(--mermaid-accent-color1);
}
g.classGroup line {
  stroke: var(--mermaid-accent-color1);
  stroke-width: 1;
}
g.classLabel .box {
  stroke: none;
  stroke-width: 0;
  fill: var(--mermaid-accent-color1-alt);
  opacity: 0.5;
}
.relation {
  stroke: var(--fore-color);
  stroke-width: 1;
  fill: none;
}
.composition,
#compositionStart,
#compositionEnd,
.aggregation,
#aggregationStart,
#aggregationEnd,
#dependencyStart,
#dependencyEnd,
#extensionStart,
#extensionEnd {
  fill: var(--fore-color);
  stroke: var(--fore-color);
  stroke-width: 1;
}
div.mermaidTooltip {
  position: absolute;
  text-align: center;
  max-width: 200px;
  padding: 2px;
  background: var(--fore-color-alt);
  border: 1px solid #d0d0d0;
  border-radius: 2px;
  pointer-events: none;
  z-index: 100;
}
/* ----- gantt diagram 甘特图 ----- */
.section {
  stroke: none;
}
.section0 {
  fill: var(--fore-color-alt);
}
.section2 {
  fill: var(--fore-color-alt);
}
.section1,
.section3 {
  fill: rgba(24, 26, 30, 0.05);
}
.sectionTitle0,
.sectionTitle1,
.sectionTitle2,
.sectionTitle3 {
  fill: var(--fore-color);
}
.sectionTitle {
  text-anchor: start;
  font-size: 0.8em;
  line-height: 2em;
}
.grid .tick {
  stroke: var(--fore-color-alt);
  shape-rendering: crispEdges;
}
.grid path {
  stroke-width: 0;
}
.today {
  fill: none;
  stroke: var(--mermaid-accent-color4);
  stroke-width: 3px;
}
.task {
  stroke-width: 2;
}
.taskText {
  text-anchor: middle;
  font-size: 0.8em;
  line-height: 2em;
  font-family: "Noto Sans CJK SC", "PingFang SC", "苹方-简", "Helvetica Neue", Helvetica, Arial, Tahoma, SimHei, "黑体", "Heiti SC", "黑体-简", "Microsoft YaHei", "微软雅黑", sans-serif;
}
.taskTextOutsideRight {
  fill: var(--fore-color);
  font-family: "Noto Sans CJK SC", "PingFang SC", "苹方-简", "Helvetica Neue", Helvetica, Arial, Tahoma, SimHei, "黑体", "Heiti SC", "黑体-简", "Microsoft YaHei", "微软雅黑", sans-serif;
  text-anchor: start;
}
.taskTextOutsideLeft {
  fill: var(--fore-color);
  font-family: "Noto Sans CJK SC", "PingFang SC", "苹方-简", "Helvetica Neue", Helvetica, Arial, Tahoma, SimHei, "黑体", "Heiti SC", "黑体-简", "Microsoft YaHei", "微软雅黑", sans-serif;
  text-anchor: end;
}
/* 当前的任务 */
.active0,
.active1,
.active2,
.active3 {
  fill: var(--mermaid-accent-color1-alt);
  stroke: var(--mermaid-accent-color1);
}
.activeText0,
.activeText1,
.activeText2,
.activeText3 {
  fill: var(--mermaid-accent-color1) !important;
}
/* 已完成的任务 */
.done0,
.done1,
.done2,
.done3 {
  stroke: none;
  fill: var(--mermaid-accent-color1-alt);
  stroke-width: 2;
  stroke-dasharray: 2;
}
/* 未来的任务 */
.task0,
.task1,
.task2,
.task3 {
  fill: var(--doc-bg-color);
  stroke: var(--mermaid-accent-color1);
  stroke-dasharray: 2;
}
.taskText0,
.taskText1,
.taskText2,
.taskText3 {
  fill: var(--fore-color);
}
.taskTextOutside0,
.taskTextOutside2 {
  fill: var(--fore-color);
}
.taskTextOutside1,
.taskTextOutside3 {
  fill: var(--fore-color);
}
.doneText0,
.doneText1,
.doneText2,
.doneText3 {
  fill: var(--fore-color) !important;
}
/* 当前关键路径的任务 */
.activeCrit0,
.activeCrit1,
.activeCrit2,
.activeCrit3 {
  stroke: var(--mermaid-accent-color4);
  fill: var(--mermaid-accent-color4-alt);
  stroke-width: 2;
}
.activeCritText0,
.activeCritText1,
.activeCritText2,
.activeCritText3 {
  fill: var(--mermaid-accent-color4) !important;
}
/* 已完成的关键路径任务 */
.doneCrit0,
.doneCrit1,
.doneCrit2,
.doneCrit3 {
  stroke: none;
  fill: var(--mermaid-accent-color4-alt);
  stroke-width: 2;
  cursor: pointer;
  shape-rendering: crispEdges;
}
/* 未来的关键路径任务 */
.crit0,
.crit1,
.crit2,
.crit3 {
  stroke: var(--mermaid-accent-color4);
  fill: var(--doc-bg-color);
  stroke-width: 2;
  stroke-dasharray: 2;
}
.critText0,
.critText1,
.critText2,
.critText3 {
  fill: var(--fore-color);
}
.doneCritText0,
.doneCritText1,
.doneCritText2,
.doneCritText3 {
  fill: var(--fore-color) !important;
}
/* 标题 */
.titleText {
  text-anchor: middle;
  font-size: 1.5em;
  line-height: 2em;
  font-family: "Noto Sans CJK SC", "PingFang SC", "苹方-简", "Helvetica Neue", Helvetica, Arial, Tahoma, SimHei, "黑体", "Heiti SC", "黑体-简", "Microsoft YaHei", "微软雅黑", sans-serif;
  font-weight: bold;
  fill: var(--fore-color);
}
/**************************************
* 重定义Typora原生样式
**************************************/
#write {
  max-width: 100%;
  margin: 0 auto;
  padding: 0 10px 0 10px;
}
#write > ul:first-child,
#write > ol:first-child {
  margin-top: 30px;
}
#write pre.ty-contain-cm {
  padding: 0;
  border-radius: 18px;
}
.CodeMirror-sizer {
  background-color: var(--doc-bg-color);
}
.CodeMirror pre {
  padding: 0 10px;
}
.CodeMirror-line:hover {
  background-color: var(--doc-bg-color-alt);
}
.CodeMirror.cm-s-inner {
  border-radius: 16px;
}
.CodeMirror div.CodeMirror-cursor {
  border-color: var(--cm-CodeMirror-cursor);
}
.cm-s-inner .cm-variable,
.cm-s-inner .cm-operator,
.cm-s-inner .cm-property {
  color: var(--cm-variable);
}
.cm-s-inner .cm-variable-2 {
  color: var(--cm-variable-2);
}
.cm-s-inner .cm-variable-3 {
  color: var(--cm-variable-3);
}
.cm-s-inner .cm-keyword {
  color: var(--cm-keyword);
}
.cm-s-inner .cm-tag {
  color: var(--cm-tag);
}
.cm-s-inner .cm-attribute {
  color: var(--cm-attribute);
}
.CodeMirror div.CodeMirror-cursor {
  border-left: 1px solid #b8bfc6;
  z-index: 3;
}
.cm-s-inner .cm-string {
  color: var(--cm-string);
}
.cm-s-inner .cm-string-2 {
  color: var(--cm-string-2);
}
.cm-s-inner .cm-comment,
.cm-s-inner.cm-comment {
  color: var(--cm-comment);
}
.cm-s-inner .cm-header,
.cm-s-inner .cm-def,
.cm-s-inner.cm-header,
.cm-s-inner.cm-def {
  color: var(--cm-header);
}
.cm-s-inner .cm-quote,
.cm-s-inner.cm-quote {
  color: var(--cm-quote);
}
.cm-s-inner .cm-hr {
  color: var(--cm-hr);
}
.cm-s-inner .cm-link {
  color: var(--cm-link);
}
.cm-s-inner .cm-negative {
  color: var(--cm-negative);
}
.cm-s-inner .cm-positive {
  color: var(--cm-positive);
}
.cm-s-inner .cm-meta,
.cm-s-inner .cm-qualifier {
  color: var(--cm-meta);
}
.cm-s-inner .cm-builtin {
  color: var(--cm-bulidin);
}
.cm-s-inner .cm-bracket {
  color: var(--cm-bracket);
}
.cm-s-inner .cm-atom,
.cm-s-inner.cm-atom {
  color: var(--cm-atom);
}
.cm-s-inner .cm-number {
  color: var(--cm-number);
}
/* 数学公式 */
.MathJax_SVG,
.MathJax_SVG_Display {
  border: 2px solid var(--table-border-color);
  border-radius: 16px;
  padding: 0.3em 0.3em;
}
.MathJax_SVG:hover,
.MathJax_SVG_Display:hover {
  border-color: #4E4BC2;
}
.MathJax_SVG:active,
.MathJax_SVG_Display:active {
  background-color: var(--doc-bg-color);
  transform: scale(1.5);
  box-shadow: 0 2px 10px rgba(0, 0, 0, 0.3) !important;
}
.MathJax_SVG:focus,
.MathJax_SVG_Display:focus {
  box-shadow: none;
  outline: none;
}
.MathJax_SVG_Display > .MathJax_SVG {
  border: none;
}
.MathJax_SVG g text {
  color: var(--fore-color);
}
/* md 系统样式 */
.md-toc-inner {
  text-decoration: none;
  box-shadow: none;
}
.md-toc-item {
  color: var(--fore-color);
  font-family: "Noto Sans CJK SC", "PingFang SC", "苹方-简", "Helvetica Neue", Helvetica, Arial, Tahoma, SimHei, "黑体", "Heiti SC", "黑体-简", "Microsoft YaHei", "微软雅黑", sans-serif;
  font-size: 1em;
  margin-left: 10px;
  margin-right: 10px;
  padding-right: 5px;
  border-radius: 8px;
  text-overflow: ellipsis;
  white-space: nowrap;
  overflow: hidden;
}
.md-toc-item::before {
  color: var(--toc-header-num-color);
  padding-left: 5px;
}
.md-toc-item:hover {
  color: #00FFFD;
  background-color: #4E4BC2;
  transform: translateY(-2px);
}
.md-toc-item:hover::before {
  color: #00FFFD;
}
.md-toc-item:active {
  background-color: #706f9e;
  box-shadow: none;
  transform: none;
}
.md-toc,
.mdx-toc {
  margin-top: 1.5em;
  margin-bottom: 0.5em;
  border-radius: 0;
  line-height: 2;
}
.md-toc-h1 {
  font-size: 1em;
}
.md-toc-h2 {
  font-size: 1em;
}
.md-toc-h3,
.md-toc-h4,
.md-toc-h5 {
  font-size: 1em;
}
.md-toc-item a {
  text-decoration: none;
  padding: 0 0 0 0;
  border-radius: 0;
  border: 0;
}
.md-toc-item a:hover {
  color: #00FFFD !important;
  background-color: rgba(255, 255, 255, 0);
  box-shadow: none;
  text-decoration: none;
  border: 0;
}
#svg-figure-content {
  margin: 5px;
  padding: 5px;
  border-radius: 0.3em;
  cursor: pointer;
  display: table-cell;
  align-content: center;
  text-align: center;
  vertical-align: middle;
  width: 100%;
}
sup.md-footnote {
  background-color: inherit;
}
sup.md-footnote > a {
  color: #4E4BC2 !important;
  margin-left: 0.5em;
  margin-right: 0.5em;
  box-shadow: none;
  border-bottom: none;
}
sup.md-footnote > a:hover {
  box-shadow: 0 -0.5em 0 rgba(78, 75, 194, 0.3) inset;
  border-bottom: 0;
}
.footnote-line > a:not(.reversefootnote) {
  color: var(--fore-color);
}
kbd {
  font-family: "Fira Code", Menlo, Consolas, "Courier New", "Noto Sans CJK SC", SimHei, "黑体", "Heiti SC", "黑体-简", "Microsoft YaHei", "微软雅黑", monospace;
  font-size: 0.85em;
  font-weight: bold;
  border-radius: 0.4em;
  margin: 0 0.3em;
  padding: 0.2em 0.5em 0.1em 0.5em;
  border: 0;
  color: var(--doc-bg-color);
  background-color: var(--fore-color);
  box-shadow: 0 0.2em 0 0 var(--fore-color-alt);
}
ul > .md-task-list-item {
  list-style-type: decimal !important;
}
ul > li > ul > .md-task-list-item {
  list-style-type: lower-alpha !important;
}
ul > li > ul > li > ul > .md-task-list-item {
  list-style-type: disc !important;
}
ul > li > ul > li > ul > li > ul > .md-task-list-item {
  list-style-type: lower-roman !important;
}
ul > li > ul > li > ul > li > ul > li > ul > .md-task-list-item {
  list-style-type: circle !important;
}
ul > li > ul > li > ul > li > ul > li > ul > li > ul > .md-task-list-item {
  list-style-type: square !important;
}
.md-task-list-item > input {
  margin-left: -0.5em !important;
  margin-top: 0.3em !important;
}
.md-task-list-item > p {
  margin-left: 1.2em !important;
  margin-top: 0;
  margin-bottom: 0;
}
li > :first-child,
li p {
  margin-top: 0;
  margin-bottom: 0;
}
/**************************************
* VLOOK UI 自定义样式
**************************************/
.mdx-font-title-sans {
  font-family: "Noto Sans CJK SC", "PingFang SC", "苹方-简", "Helvetica Neue", Helvetica, Arial, Tahoma, "Microsoft YaHei", "微软雅黑", sans-serif !important;
}
.mdx-font-header-sans {
  font-family: "Noto Sans CJK SC", "PingFang SC", "苹方-简", "Helvetica Neue", Helvetica, Arial, Tahoma, "Microsoft YaHei", "微软雅黑", sans-serif !important;
}
.mdx-font-text-sans {
  font-family: "Noto Sans CJK SC", "PingFang SC", "苹方-简", "Helvetica Neue", Helvetica, Arial, Tahoma, "Microsoft YaHei", "微软雅黑", sans-serif !important;
}
.mdx-font-bold-sans {
  font-family: "Noto Sans CJK SC", "PingFang SC", "苹方-简", "Helvetica Neue", Helvetica, Arial, Tahoma, "Microsoft YaHei", "微软雅黑", sans-serif !important;
}
.mdx-font-code-sans {
  font-family: "Fira Code", Menlo, Consolas, "Courier New", "Noto Sans CJK SC", "Microsoft YaHei", "微软雅黑", monospace !important;
}
.mdx-font-title-serif {
  font-family: "Noto Serif CJK SC", "Noto Sans CJK SC", "PingFang SC", "苹方-简", "Helvetica Neue", Helvetica, Arial, Tahoma, SimHei, "黑体", "Heiti SC", "黑体-简", "Microsoft YaHei", "微软雅黑", sans-serif !important;
}
.mdx-font-header-serif {
  font-family: "Noto Serif CJK SC", "Noto Sans CJK SC", "PingFang SC", "苹方-简", "Helvetica Neue", Helvetica, Arial, Tahoma, SimHei, "黑体", "Heiti SC", "黑体-简", "Microsoft YaHei", "微软雅黑", sans-serif !important;
}
.mdx-font-text-serif {
  font-family: "Noto Serif CJK SC", "Times New Roman", Times, SimSun, "宋体", "Songti SC", "宋体-简", STZhongsong, "华文中宋", serif;
}
.mdx-font-bold-serif {
  font-family: "Noto Sans CJK SC", "PingFang SC", "苹方-简", "Helvetica Neue", Helvetica, Arial, Tahoma, SimHei, "黑体", "Heiti SC", "黑体-简", "Microsoft YaHei", "微软雅黑", sans-serif !important;
}
.mdx-font-code-serif {
  font-family: "Fira Code", Menlo, Consolas, "Courier New", "Noto Sans CJK SC", SimHei, "黑体", "Heiti SC", "黑体-简", "Microsoft YaHei", "微软雅黑", monospace !important;
}
.mdx-spotlight {
  display: none;
  position: fixed;
  left: 0;
  top: 0;
  width: 100%;
  height: 100%;
  background-size: cover;
  pointer-events: none;
  z-index: 4000;
}
.mdx-tool-tips,
.mdx-info-tips {
  display: none;
  position: fixed;
  margin-left: auto;
  padding: 0.5em 1em;
  text-align: center;
  white-space: pre-wrap;
  border-radius: 16px;
  border: 1px var(--table-border-color) solid;
  font-family: "Noto Sans CJK SC", "PingFang SC", "苹方-简", "Helvetica Neue", Helvetica, Arial, Tahoma, SimHei, "黑体", "Heiti SC", "黑体-简", "Microsoft YaHei", "微软雅黑", sans-serif;
  color: var(--tips-bg-color-inset);
  background-color: var(--tips-bg-color);
  z-index: 3000;
}
.mdx-tool-tips {
  border-top: 0;
  box-shadow: 0 2px 0 0 #4E4BC2 inset, 0 3px 20px rgba(0, 0, 0, 0.3), 0 0 0 0 rgba(0, 0, 0, 0);
  text-align: left;
  white-space: pre;
}
.mdx-tool-tips a,
.mdx-info-tips a {
  color: var(--tips-bg-color-inset) !important;
  font-weight: bold;
}
.mdx-content-expander {
  font-family: "Noto Sans CJK SC", "PingFang SC", "苹方-简", "Helvetica Neue", Helvetica, Arial, Tahoma, SimHei, "黑体", "Heiti SC", "黑体-简", "Microsoft YaHei", "微软雅黑", sans-serif;
  font-weight: bold;
  height: 100px;
  margin-top: -120px;
  background: linear-gradient(0deg, var(--doc-bg-color) 10px, var(--doc-bg-color-transparent));
  border-radius: 0 0 16px 16px;
  position: absolute;
  text-align: center;
  vertical-align: bottom;
  cursor: pointer;
  z-index: 10;
}
.mdx-content-expander > .mdx-btn {
  margin-top: 70px;
  width: 180px;
  height: 30px;
  border-radius: 16px;
  background-color: #00A8BE;
  display: inline-flex;
}
.mdx-doc-logo {
  margin-top: 30px;
  width: 100%;
  height: 80px;
  background-image: url("");
  background-size: 80px 80px;
  background-repeat: no-repeat;
  background-position: top center;
}
.mdx-load-screen {
  cursor: wait;
  position: fixed;
  color: #00DAD8;
  background: linear-gradient(#004e58 0%, #00A8BE 50%, #00A8BE);
  left: 0;
  top: 0;
  width: 100%;
  height: 100%;
  text-align: center;
  font-family: "Noto Serif CJK SC", "Noto Sans CJK SC", "PingFang SC", "苹方-简", "Helvetica Neue", Helvetica, Arial, Tahoma, SimHei, "黑体", "Heiti SC", "黑体-简", "Microsoft YaHei", "微软雅黑", sans-serif;
  font-size: 1.5em;
  overflow: auto;
  z-index: 4000;
}
@keyframes breathe-text {
  0% {
    opacity: 1;
    transform: scale(1.05);
  }
  100% {
    opacity: 0.8;
    transform: scale(0.99);
  }
}
@keyframes breathe-button {
  0% {
    opacity: 1;
    transform: scale(1.05);
    filter: brightness(120%);
  }
  100% {
    opacity: 0.8;
    transform: scale(0.97);
    filter: brightness(100%);
  }
}
.mdx-load-screen-tips {
  padding: 20px 20px 10px 20px;
  animation: 1s breathe-text infinite alternate;
}
.mdx-load-screen-tips > div {
  text-align: center;
  line-height: 1;
  margin-bottom: 1em;
}
.mdx-btn-load-screen {
  cursor: not-allowed;
  padding-left: 1em;
  padding-right: 1em;
  color: #00DAD8;
  border: 1px solid rgba(0, 218, 216, 0.5);
  font-family: "Noto Sans CJK SC", "PingFang SC", "苹方-简", "Helvetica Neue", Helvetica, Arial, Tahoma, SimHei, "黑体", "Heiti SC", "黑体-简", "Microsoft YaHei", "微软雅黑", sans-serif;
  font-weight: normal;
  display: inline-block;
  border-radius: 1em;
  margin-bottom: 2em;
}
.mdx-btn-load-screen-done {
  cursor: pointer;
  border: none;
  font-size: 1.2em;
  font-weight: bold;
  color: #00FFFD;
  background-color: #4E4BC2;
  animation: 1s breathe-button infinite alternate;
}
.mdx-btn-load-screen-done:hover {
  color: #4E4BC2;
  background-color: #00FFFD;
  box-shadow: 0 2px 10px rgba(0, 0, 0, 0.3);
  transform: translateY(-2px);
}
.mdx-btn-load-screen-done:active {
  color: #00FFFD;
  background-color: #4E4BC2;
  transform: none;
  box-shadow: none;
}
.mdx-current-blockfocus-item {
  box-shadow: 0 0 10px 0 #4E4BC2;
  border-radius: 16px;
}
.md-diagram-panel svg {
  width: auto;
}
.md-diagram-panel svg[viewBox^="-8 -8"] {
  padding-bottom: 8px;
}
.mdx-figure-content svg {
  width: 100%;
}
.mdx-blockquote-folder:hover {
  color: #4E4BC2;
  transform: translateY(-2px);
}
.mdx-blockquote-folder:active {
  color: #706f9e;
  transform: none;
}
.mdx-blockquote-folder small {
  color: #4E4BC2;
  font-family: "Noto Sans CJK SC", "PingFang SC", "苹方-简", "Helvetica Neue", Helvetica, Arial, Tahoma, SimHei, "黑体", "Heiti SC", "黑体-简", "Microsoft YaHei", "微软雅黑", sans-serif;
  border: 1px solid #4E4BC2;
  border-radius: 8px;
  margin-left: 1em;
  padding: 0.1em 0.5em;
  font-size: 0.85em;
}
.mdx-toc-panel {
  background-color: var(--doc-bg-color-alt);
  border-radius: 16px;
  cursor: default;
  display: block;
  left: var(--vlook-toc-box-left);
  top: 10px;
  bottom: 40px;
  width: var(--vlook-toc-box-width);
  padding: 0;
  position: fixed;
  z-index: 2000;
  user-select: none;
}
.mdx-toc-panel-float {
  top: 10px;
  bottom: 40px;
  box-shadow: 0 0 0 1px rgba(0, 168, 190, 0.3) inset, 0 3px 20px rgba(0, 0, 0, 0.3);
}
.mdx-toc-panel-block {
  top: 60px;
  bottom: 10px;
  box-shadow: 0 0 0 1px rgba(0, 168, 190, 0.3) inset, 0 3px 20px rgba(0, 0, 0, 0.3);
}
.mdx-toc-panel-header {
  color: #181A1E;
  font-family: "Noto Sans CJK SC", "PingFang SC", "苹方-简", "Helvetica Neue", Helvetica, Arial, Tahoma, SimHei, "黑体", "Heiti SC", "黑体-简", "Microsoft YaHei", "微软雅黑", sans-serif;
  font-size: 1.2em;
  height: 70px;
  padding: 10px 0 0 0;
  background: linear-gradient(180deg, var(--doc-bg-color-alt) 50px, var(--doc-bg-color-alt-transparent));
  left: 2px;
  right: 2px;
  top: 2px;
  position: absolute;
  border-top-right-radius: 16px;
  border-top-left-radius: 16px;
  z-index: 10;
}
.mdx-toc-panel-title {
  text-align: center;
  position: absolute;
  border-radius: 8px;
  left: 10px;
  right: 10px;
  padding-left: 10px;
  padding-right: 10px;
  text-overflow: ellipsis;
  white-space: nowrap;
  overflow: hidden;
  font-size: 1em;
  font-family: "Noto Sans CJK SC", "PingFang SC", "苹方-简", "Helvetica Neue", Helvetica, Arial, Tahoma, SimHei, "黑体", "Heiti SC", "黑体-简", "Microsoft YaHei", "微软雅黑", sans-serif;
  font-weight: bold;
  color: var(--a-color);
  cursor: pointer;
}
.mdx-toc-panel-title:hover {
  color: #00FFFD;
  background-color: #4E4BC2;
  transform: translateY(-2px);
  box-shadow: 0 2px 10px rgba(0, 0, 0, 0.3);
}
.mdx-toc-panel-title:active {
  background-color: #706f9e;
  box-shadow: none;
  transform: none;
}
.mdx-toc-panel-body-scroll {
  width: 100%;
  height: 100%;
  padding: 0;
  padding-top: 40px;
  padding-bottom: 10px;
  border-radius: 16px;
  overflow: auto;
  overflow-y: hidden;
}
.mdx-toc-panel-body {
  width: 100%;
  height: 100%;
  padding: 10px 0 10px 0;
  overflow-y: scroll;
}
.mdx-toc-panel-footer {
  height: 30px;
  line-height: 40px;
  left: 1px;
  right: 1px;
  bottom: 1px;
  text-align: center;
  padding: 0;
  background: linear-gradient(0deg, var(--doc-bg-color-alt) 10px, var(--doc-bg-color-alt-transparent));
  border-bottom-right-radius: 16px;
  border-bottom-left-radius: 16px;
  position: absolute;
  z-index: 10;
}
.mdx-copyright {
  left: 0;
  bottom: 0;
  text-align: center;
  width: 100%;
  height: 40px;
  padding: 5px 10px;
  font-size: 0.85em;
  font-family: "Noto Sans CJK SC", "PingFang SC", "苹方-简", "Helvetica Neue", Helvetica, Arial, Tahoma, SimHei, "黑体", "Heiti SC", "黑体-简", "Microsoft YaHei", "微软雅黑", sans-serif;
  position: absolute;
}
.mdx-copyright,
.mdx-copyright a {
  color: #C0C4C8 !important;
}
.mdx-float-card {
  box-shadow: 0 3px 20px rgba(0, 0, 0, 0.3), 0 0 0 0 rgba(0, 0, 0, 0);
}
.mdx-footer-note-panel {
  position: fixed;
  left: 15%;
  right: 15%;
  bottom: -200px;
  height: 200px;
  border-radius: 16px;
  box-shadow: 0 3px 20px rgba(0, 0, 0, 0.3);
  margin: 0 auto;
  background-color: var(--doc-bg-color-alt);
  display: none;
  z-index: 2100;
}
.mdx-footer-note-panel > a {
  color: var(--fore-color);
}
.mdx-footer-note-panel-header {
  height: 30px;
  top: 2px;
  left: 2px;
  right: 2px;
  position: absolute;
  background: linear-gradient(180deg, var(--doc-bg-color-alt) 5px, var(--doc-bg-color-alt-transparent));
  border-radius: 16px;
}
.mdx-footer-note-panel-content {
  width: 100%;
  top: 2px;
  bottom: 2px;
  padding: 10px 20px;
  position: absolute;
  overflow-x: auto;
}
.mdx-footer-note-panel-all {
  font-weight: bold;
  height: 60px;
  left: 2px;
  right: 2px;
  bottom: 2px;
  line-height: 70px;
  bottom: 0;
  padding: 0 20px;
  margin: 2px;
  border-radius: 16px;
  background: linear-gradient(0deg, var(--doc-bg-color-alt) 35px, var(--doc-bg-color-alt-transparent));
  position: absolute;
}
.mdx-toolbar {
  border-bottom-left-radius: 16px;
  border-bottom-right-radius: 16px;
  left: 10px;
  top: 10px;
  width: var(--vlook-toc-box-width);
  height: 50px;
  position: fixed;
  background-color: #00A8BE;
  z-index: 100;
}
.mdx-btn-outline {
  display: flex;
  justify-content: center;
  align-items: center;
  color: #FFFFFF;
  cursor: pointer;
  float: left;
  width: 30px;
  height: 30px;
  padding-top: 0;
  margin-top: 10px;
  margin-left: 10px;
  text-align: center;
  visibility: visible;
}
.mdx-header-current {
  font-weight: bold;
  color: #00A8BE;
  background-color: var(--doc-bg-color);
  box-shadow: 0 0 0 2px rgba(0, 168, 190, 0.5) inset;
}
.mdx-header-current::before {
  color: #00A8BE;
}
.mdx-folder {
  color: #737c8f;
  float: left;
  width: 20px;
  text-align: center;
}
.mdx-folder:hover {
  color: #706f9e;
}
.mdx-btn {
  display: flex;
  justify-content: center;
  align-items: center;
  vertical-align: middle;
  color: #FFFFFF;
  cursor: pointer;
  padding: 0;
  width: 40px;
  height: 30px;
  border-radius: 8px;
}
.mdx-btn-hover:hover {
  background-color: #4E4BC2;
  box-shadow: 0 2px 10px rgba(0, 0, 0, 0.3);
  color: #00FFFD;
  transform: translateY(-2px);
}
.mdx-btn-hover:hover > svg > use {
  fill: #00FFFD;
}
.mdx-btn-float {
  background-color: #00A8BE;
}
.mdx-btn:active {
  background-color: #706f9e;
  box-shadow: none;
  transform: none;
}
@keyframes loading-circle {
  from {
    transform: rotate(0deg);
  }
  to {
    transform: rotate(359deg);
  }
}
.mdx-audio-mini-control-loading {
  animation: loading-circle 2s linear infinite;
}
.mdx-audio-mini-control-disabled {
  color: var(--fore-color);
  background-color: #B0B4B8;
  border-radius: 15px;
  text-align: center;
  line-height: 30px;
  height: 30px;
  width: 30px;
  padding: 2px;
  box-shadow: 0 0 1px rgba(0, 255, 253, 0.7);
  display: inline-block;
  cursor: not-allowed;
}
.mdx-audio-mini-control {
  color: #FFFFFF;
  background-color: #00A8BE;
  border-radius: 15px;
  text-align: center;
  line-height: 30px;
  height: 30px;
  width: 30px;
  padding: 2px;
  box-shadow: 0 0 1px rgba(0, 255, 253, 0.7);
  display: inline-block;
  cursor: pointer;
}
.mdx-audio-mini-control:hover {
  background-color: #4E4BC2;
  box-shadow: 0 2px 10px rgba(0, 0, 0, 0.3);
  color: #00FFFD;
  transform: translateY(-2px);
}
.mdx-audio-mini-control:active {
  background-color: #706f9e;
}
@keyframes breathe-circle {
  0% {
    box-shadow: 0 0 0 0 rgba(78, 75, 194, 0.7);
  }
  100% {
    box-shadow: 0 0 0 3px rgba(78, 75, 194, 0.7);
  }
}
.mdx-audio-mini-control-playing {
  animation: 500ms breathe-circle infinite alternate;
}
.mdx-chapter-nav {
  color: #FFFFFF;
  background-color: #00A8BE;
  border-bottom-left-radius: 16px;
  border-bottom-right-radius: 16px;
  top: -50px;
  left: calc(var(--vlook-toc-box-width) + 30px);
  right: 10px;
  height: 50px;
  position: fixed;
  padding: 0;
  vertical-align: middle;
  z-index: 100;
  user-select: none;
}
.mdx-chapter-nav-prev {
  top: 0;
  left: 0;
  width: 20%;
  height: 50px;
  position: absolute;
  cursor: pointer;
  border-bottom-left-radius: 16px;
}
.mdx-chapter-nav-prev-noeffect-hover,
.mdx-chapter-nav-prev-effect-hover {
  background: linear-gradient(to right, #4E4BC2, #00A8BE);
  text-shadow: 0 2px 10px rgba(0, 0, 0, 0.3);
  transform: translateY(-2px);
}
.mdx-chapter-nav-prev-noeffect-hover > svg > use,
.mdx-chapter-nav-prev-effect-hover > svg > use {
  fill: #00FFFD;
}
.mdx-chapter-nav-prev-noeffect-hover > .mdx-chapter-nav-prev-text,
.mdx-chapter-nav-prev-effect-hover > .mdx-chapter-nav-prev-text {
  color: #00FFFD;
}
.mdx-chapter-nav-prev-effect::before {
  content: "";
  position: absolute;
  left: 0;
  right: 0;
  top: 0;
  bottom: 0;
  background: linear-gradient(to right, #4E4BC2, #00A8BE);
  border-bottom-left-radius: 16px;
  opacity: 0;
  z-index: -1;
  transition: all 200ms ease-in;
}
.mdx-chapter-nav-prev-effect-hover::before {
  opacity: 1;
}
.mdx-chapter-nav-prev-noeffect:active,
.mdx-chapter-nav-prev-effect:active,
.mdx-chapter-nav-prev-effect:active::before {
  background: linear-gradient(to right, #706f9e, #00A8BE);
  box-shadow: none;
  transform: none;
}
.mdx-chapter-nav-prev-text {
  top: 0;
  left: 30px;
  width: 100%;
  height: 50px;
  line-height: 50px;
  font-family: "Noto Sans CJK SC", "PingFang SC", "苹方-简", "Helvetica Neue", Helvetica, Arial, Tahoma, SimHei, "黑体", "Heiti SC", "黑体-简", "Microsoft YaHei", "微软雅黑", sans-serif;
  color: #FFFFFF;
  text-align: left;
  text-overflow: ellipsis;
  white-space: nowrap;
  overflow: hidden;
  position: absolute;
  cursor: pointer;
  display: block;
}
.mdx-chapter-nav-current {
  font-family: "Noto Sans CJK SC", "PingFang SC", "苹方-简", "Helvetica Neue", Helvetica, Arial, Tahoma, SimHei, "黑体", "Heiti SC", "黑体-简", "Microsoft YaHei", "微软雅黑", sans-serif;
  font-size: 1.4em;
  font-weight: bold;
  text-align: center;
  line-height: 50px;
  margin-left: 220px;
  margin-right: 220px;
  text-overflow: ellipsis;
  white-space: nowrap;
  overflow: hidden;
  width: auto;
  height: 50px;
  cursor: pointer;
  display: block;
}
.mdx-chapter-nav-current-noeffect-hover,
.mdx-chapter-nav-current-effect-hover {
  text-shadow: 0 2px 10px rgba(0, 0, 0, 0.3);
  color: #00FFFD;
  transform: translateY(-2px);
  background: linear-gradient(90deg, rgba(78, 75, 194, 0), #4E4BC2, rgba(78, 75, 194, 0));
}
.mdx-chapter-nav-current-effect::before {
  content: "";
  position: absolute;
  left: 30%;
  right: 30%;
  top: 0;
  bottom: 0;
  background: linear-gradient(90deg, rgba(78, 75, 194, 0), #4E4BC2, rgba(78, 75, 194, 0));
  opacity: 0;
  z-index: -1;
  transition: all 200ms ease-in;
}
.mdx-chapter-nav-current-effect-hover::before {
  opacity: 1;
}
.mdx-chapter-nav-current-noeffect:active,
.mdx-chapter-nav-current-effect:active,
.mdx-chapter-nav-current-effect:active::before {
  background: linear-gradient(90deg, rgba(112, 111, 158, 0), #706f9e, rgba(112, 111, 158, 0));
  box-shadow: none;
  transform: none;
}
.mdx-chapter-nav-next {
  top: 0;
  right: 0;
  width: 20%;
  height: 50px;
  position: absolute;
  cursor: pointer;
  border-bottom-right-radius: 16px;
}
.mdx-chapter-nav-next-noeffect-hover,
.mdx-chapter-nav-next-effect-hover {
  background: linear-gradient(to left, #4E4BC2, #00A8BE);
  text-shadow: 0 2px 10px rgba(0, 0, 0, 0.3);
  transform: translateY(-2px);
}
.mdx-chapter-nav-next-noeffect-hover > svg > use,
.mdx-chapter-nav-next-effect-hover > svg > use {
  fill: #00FFFD;
}
.mdx-chapter-nav-next-noeffect-hover > .mdx-chapter-nav-next-text,
.mdx-chapter-nav-next-effect-hover > .mdx-chapter-nav-next-text {
  color: #00FFFD;
}
.mdx-chapter-nav-next-effect::before {
  content: "";
  position: absolute;
  left: 0;
  right: 0;
  top: 0;
  bottom: 0;
  background: linear-gradient(to left, #4E4BC2, #00A8BE);
  border-bottom-right-radius: 16px;
  opacity: 0;
  z-index: -1;
  transition: all 200ms ease-in;
}
.mdx-chapter-nav-next-effect-hover::before {
  opacity: 1;
}
.mdx-chapter-nav-next-noeffect:active,
.mdx-chapter-nav-next-effect:active,
.mdx-chapter-nav-next-effect:active::before {
  background: linear-gradient(to left, #706f9e, #00A8BE);
  box-shadow: none;
  transform: none;
}
.mdx-chapter-nav-next-text {
  top: 0;
  right: 30px;
  width: 100%;
  height: 50px;
  line-height: 50px;
  font-family: "Noto Sans CJK SC", "PingFang SC", "苹方-简", "Helvetica Neue", Helvetica, Arial, Tahoma, SimHei, "黑体", "Heiti SC", "黑体-简", "Microsoft YaHei", "微软雅黑", sans-serif;
  color: #FFFFFF;
  text-align: right;
  text-overflow: ellipsis;
  white-space: nowrap;
  overflow: hidden;
  position: absolute;
  cursor: pointer;
  display: block;
}
.mdx-btn-fullscreen {
  margin-top: 10px;
  margin-left: 5px;
  float: left;
  display: none;
}
.mdx-btn-color-scheme {
  margin-top: 10px;
  margin-right: 5px;
  float: right;
}
.mdx-btn-font-style {
  margin-top: 10px;
  margin-right: 5px;
  float: right;
}
.mdx-btn-figure-viewer {
  margin-top: 10px;
  margin-left: 5px;
  visibility: hidden;
  float: left;
}
.mdx-btn-spotlight {
  margin-top: 10px;
  margin-right: 5px;
  float: right;
}
.mdx-btn-print {
  margin-top: 10px;
  margin-right: 10px;
  margin-left: 30px;
  float: right;
}
.mdx-figure-nav {
  left: 0;
  top: 0;
  width: 100%;
  height: 100%;
  background-color: rgba(0, 0, 0, 0.85);
  position: fixed;
  display: none;
  z-index: 2200;
}
.mdx-btn-figure-nav {
  display: flex;
  justify-content: center;
  align-items: center;
  vertical-align: middle;
  color: #FFFFFF;
  cursor: pointer;
  padding: 0;
}
.mdx-btn-figure-prev {
  left: 10px;
  top: auto;
  width: 30px;
  height: 70px;
  box-shadow: 0 0 0 0 rgba(0, 0, 0, 0);
  border-radius: 16px;
  position: absolute;
  bottom: 10px;
}
.mdx-btn-figure-next {
  right: 10px;
  top: auto;
  width: 30px;
  height: 70px;
  box-shadow: 0 0 0 0 rgba(0, 0, 0, 0);
  border-radius: 16px;
  position: absolute;
  bottom: 10px;
}
.mdx-btn-figure-hover {
  fill: #4E4BC2 !important;
}
.mdx-btn-figure-active {
  fill: #706f9e !important;
}
.mdx-btn-close-figure-viewer {
  display: flex;
  justify-content: flex-end;
  vertical-align: middle;
  align-items: normal;
  color: #FFFFFF;
  cursor: pointer;
  background-color: #00A8BE;
  right: -2px;
  top: -2px;
  width: 50px;
  height: 50px;
  padding: 12px 12px 8px 8px;
  box-shadow: 0 0 0 0 rgba(0, 0, 0, 0);
  border-radius: 0 0 0 50px;
  position: absolute;
}
.mdx-btn-close-figure-viewer:hover {
  background-color: #4E4BC2;
  box-shadow: 0 2px 10px rgba(0, 0, 0, 0.3);
  transform: translate(-2px, 2px);
}
.mdx-btn-close-figure-viewer:active {
  background-color: #706f9e;
  box-shadow: none;
  transform: none;
}
.mdx-btn-open-in-new-tab {
  border-radius: 16px 0 16px 0;
  box-shadow: 0 0 0 0 rgba(0, 0, 0, 0);
  background-color: #00A8BE;
  position: absolute;
  z-index: 50;
}
.mdx-btn-copy-code-block {
  border-radius: 0 16px 0 16px;
  box-shadow: 0 0 0 0 rgba(0, 0, 0, 0);
  background-color: #00A8BE;
  position: absolute;
  z-index: 50;
}
img,
.mdx-figure,
.md-diagram-panel svg {
  background-image: url("");
  background-repeat: repeat;
  background-position: left top;
  border-radius: 16px;
  padding: 0;
  border: 2px solid var(--table-border-color);
  display: block;
}
.md-diagram-panel {
  border-radius: 16px;
  margin-bottom: 20px;
  padding: 0;
}
.mdx-clickable-hover {
  border-color: #4E4BC2 !important;
}
.mdx-OINTable-hover {
  border-color: #4E4BC2 !important;
  box-shadow: 0 2px 0 rgba(0, 0, 0, 0.3);
  transform: translateY(-2px);
}
.mdx-OINTable-hover:active {
  border-color: #706f9e !important;
  box-shadow: none;
  transform: none;
}
.mdx-img-invert-in-dark {
  filter: var(--vlook-invert-in-dark);
  border-color: rgba(175, 173, 169, 0.8) !important;
}
.mdx-img-invert-in-dark:hover {
  border-color: #b1b43d !important;
}
.mdx-figure-bg-light {
  background-image: url("") !important;
}
.mdx-figure-bg-dark {
  background-image: url("") !important;
}
.mdx-figure-content {
  margin: 5px;
  padding: 5px;
  cursor: pointer;
  display: table-cell;
  align-content: center;
  text-align: center;
  vertical-align: middle;
  width: 100%;
  color: var(--fore-color);
}
.mdx-figure-page-num {
  color: #C0C4C8 !important;
  left: 10px;
  top: 10px;
  position: absolute;
  text-overflow: ellipsis;
  white-space: nowrap;
  overflow: hidden;
}
.mdx-figure-caption {
  display: inline-block;
  border-radius: 16px;
  background-color: var(--doc-bg-color-alt);
}
.mdx-figure-caption > p {
  color: var(--fore-color);
  font-size: 0.85em;
  font-family: "Noto Sans CJK SC", "PingFang SC", "苹方-简", "Helvetica Neue", Helvetica, Arial, Tahoma, SimHei, "黑体", "Heiti SC", "黑体-简", "Microsoft YaHei", "微软雅黑", sans-serif;
  margin: 5px 10px 5px 10px;
  width: auto !important;
}
.mdx-figure-caption hr {
  border-bottom: 2px solid #737c8f;
  margin: 0.5em auto;
}
use.mdx-button-ico-light {
  fill: #FFFFFF;
}
use.mdx-button-ico-dark {
  fill: #00A8BE;
}
use.mdx-folder-ico {
  fill: #00A8BE;
}
use.mdx-folder-ico:hover,
.mdx-folder-ico-hover {
  fill: #00FFFD !important;
}
.mdx-mask {
  left: 0;
  top: 0;
  width: 100%;
  height: 100%;
  text-align: center;
  position: fixed;
  background-color: rgba(0, 0, 0, 0.85);
  display: none;
  z-index: 1000;
}
.mdx-tag-c1,
.mdx-tag-c2,
.mdx-tag-c3,
.mdx-tag-c4,
.mdx-tag-c5,
.mdx-tag-c6 {
  font-family: "Noto Sans CJK SC", "PingFang SC", "苹方-简", "Helvetica Neue", Helvetica, Arial, Tahoma, SimHei, "黑体", "Heiti SC", "黑体-简", "Microsoft YaHei", "微软雅黑", sans-serif;
  font-weight: bold;
  color: #FFFFFF;
  padding: 0.1em 0.5em;
  margin: 0 0.1em;
  border-radius: 1em;
  white-space: pre;
}
.mdx-tag-c1 {
  background-color: var(--accent-color1);
  box-shadow: 0 0 0 1px var(--accent-color1-light) inset;
}
.mdx-tag-c2 {
  background-color: var(--accent-color2);
  box-shadow: 0 0 0 1px var(--accent-color2-light) inset;
}
.mdx-tag-c3 {
  background-color: var(--accent-color3);
  box-shadow: 0 0 0 1px var(--accent-color3-light) inset;
}
.mdx-tag-c4 {
  background-color: var(--accent-color4);
  box-shadow: 0 0 0 1px var(--accent-color4-light) inset;
}
.mdx-tag-c5 {
  background-color: var(--accent-color5);
  box-shadow: 0 0 0 1px var(--accent-color5-light) inset;
}
.mdx-tag-c6 {
  background-color: var(--accent-color6);
  box-shadow: 0 0 0 1px var(--accent-color6-light) inset;
}
.mdx-tag-name1,
.mdx-tag-name2,
.mdx-tag-name3,
.mdx-tag-name4,
.mdx-tag-name5,
.mdx-tag-name6 {
  font-family: "Noto Sans CJK SC", "PingFang SC", "苹方-简", "Helvetica Neue", Helvetica, Arial, Tahoma, SimHei, "黑体", "Heiti SC", "黑体-简", "Microsoft YaHei", "微软雅黑", sans-serif;
  font-weight: bold;
  margin-right: 0;
  border-radius: 1em;
  color: #FFFFFF;
  padding: 0.1em 1.8em 0.1em 0.5em;
  margin: 0 0.1em;
  white-space: pre;
}
.mdx-tag-value1,
.mdx-tag-value2,
.mdx-tag-value3,
.mdx-tag-value4,
.mdx-tag-value5,
.mdx-tag-value6 {
  font-family: "Noto Sans CJK SC", "PingFang SC", "苹方-简", "Helvetica Neue", Helvetica, Arial, Tahoma, SimHei, "黑体", "Heiti SC", "黑体-简", "Microsoft YaHei", "微软雅黑", sans-serif;
  font-weight: bold;
  border-radius: 1em 1em 1em 0;
  padding: 0.1em 0.5em;
  margin: 0 0.1em 0.1em -1.5em;
  color: #FFFFFF;
  background: var(--code-name-bg-color);
  box-shadow: 0 0 0 1px var(--code-name-shadow-color) inset;
  white-space: pre;
}
.mdx-tag-name1 {
  background-color: var(--accent-color1);
  box-shadow: 0 0 0 1px var(--accent-color1-light) inset;
}
.mdx-tag-name2 {
  background-color: var(--accent-color2);
  box-shadow: 0 0 0 1px var(--accent-color2-light) inset;
}
.mdx-tag-name3 {
  background-color: var(--accent-color3);
  box-shadow: 0 0 0 1px var(--accent-color3-light) inset;
}
.mdx-tag-name4 {
  background-color: var(--accent-color4);
  box-shadow: 0 0 0 1px var(--accent-color4-light) inset;
}
.mdx-tag-name5 {
  background-color: var(--accent-color5);
  box-shadow: 0 0 0 1px var(--accent-color5-light) inset;
}
.mdx-tag-name6 {
  background-color: var(--accent-color6);
  box-shadow: 0 0 0 1px var(--accent-color6-light) inset;
}
h6 code {
  font-weight: normal;
}
/**************************************
* 封面、封底
**************************************/
#write > h6:first-of-type,
#write > h6:last-of-type {
  display: block;
  color: #00DAD8 !important;
  font-size: 2.5em;
  font-family: "Noto Serif CJK SC", "Noto Sans CJK SC", "PingFang SC", "苹方-简", "Helvetica Neue", Helvetica, Arial, Tahoma, SimHei, "黑体", "Heiti SC", "黑体-简", "Microsoft YaHei", "微软雅黑", sans-serif;
  font-weight: bold;
  text-align: center;
  height: 950px;
  padding: 320px 60px 50px;
  margin: 10px 0 3em;
  border: 0;
  border-radius: 16px;
  box-shadow: 0 0 0 2px rgba(0, 218, 216, 0.2) inset;
  background-color: #00A8BE;
  background-image: url(""), url(""), url(""), url(""), url("");
  background-size: auto, auto, auto, auto, 100%;
  background-repeat: no-repeat, no-repeat, no-repeat, no-repeat, repeat-y;
  background-position: top center, top center, bottom center, bottom center, center;
  line-height: 1.3 !important;
}
#write > h6:last-of-type {
  height: 550px;
  margin-top: 3em;
  margin-bottom: 10px;
  padding: 270px 60px 50px;
  color: #00DAD8 !important;
  text-align: center;
  background-color: #00A8BE;
  background-image: url(""), url(""), url(""), url(""), url("");
  background-size: auto, auto, auto, auto, 100%;
  background-repeat: no-repeat, no-repeat, no-repeat, no-repeat, repeat-y;
  background-position: top center, top center, bottom center, bottom center, center;
}
#write > h6:first-of-type::before,
#write > h6:last-of-type::before {
  content: "";
}
#write > h6:first-of-type code {
  font-size: 0.4em !important;
  box-shadow: 0 0 0 1px rgba(255, 255, 255, 0.2) inset;
}
#write > h6:first-of-type strong {
  color: #00A8BE;
  font-size: 0.7em !important;
  font-family: "Noto Sans CJK SC", "PingFang SC", "苹方-简", "Helvetica Neue", Helvetica, Arial, Tahoma, SimHei, "黑体", "Heiti SC", "黑体-简", "Microsoft YaHei", "微软雅黑", sans-serif;
  font-weight: bold;
}
#write > h6:first-of-type strong::before {
  content: "By ";
  font-size: 0.7em !important;
  font-weight: normal;
}
#write > h6:first-of-type em {
  color: #00A8BE;
  font-size: 0.4em;
  font-family: "Noto Sans CJK SC", "PingFang SC", "苹方-简", "Helvetica Neue", Helvetica, Arial, Tahoma, SimHei, "黑体", "Heiti SC", "黑体-简", "Microsoft YaHei", "微软雅黑", sans-serif;
  font-style: normal !important;
}
@media screen and (max-width: 1024px) {
  .mdx-chapter-nav {
    left: 10px !important;
  }
  .mdx-chapter-nav-current {
    margin-left: 40px !important;
    margin-right: 40px !important;
  }
  .mdx-chapter-nav-prev,
  .mdx-chapter-nav-next {
    width: 20% !important;
  }
  .mdx-chapter-nav-prev-text,
  .mdx-chapter-nav-next-text {
    display: none !important;
  }
  table {
    white-space: pre !important;
  }
  #write > h6:first-of-type,
  #write > h6:last-of-type {
    font-size: 2em !important;
  }
}
@media screen and (min-width: 641px) and (max-width: 1023px) {
  .mdx-load-screen {
    font-size: 1.5em !important;
  }
}
@media screen and (min-width: 361px) and (max-width: 639px) {
  .mdx-load-screen {
    font-size: 1.3em !important;
  }
}
@media screen and (max-width: 360px) {
  .mdx-load-screen {
    font-size: 1em !important;
  }
}
@media print {
  html {
    font-size: 1em;
  }
  #write {
    margin: 0 !important;
  }
  h1,
  h2,
  h3,
  h4,
  h5,
  h6 {
    box-shadow: none !important;
    background: none !important;
  }
  .mdx-table-cross {
    box-shadow: none !important;
    background: none !important;
  }
  .mdx-figure:hover,
  img:hover,
  table:hover {
    border-color: var(--table-border-color) !important;
  }
  .mdx-figure-caption:hover {
    background-color: var(--doc-bg-color-alt);
  }
  .mdx-btn-open-in-new-tab {
    display: none;
  }
  .mdx-img-invert-in-dark {
    filter: none;
  }
  table {
    white-space: pre-wrap !important;
  }
  thead {
    display: contents !important;
  }
  table:hover {
    border-color: var(--table-border-color) !important;
  }
  table th,
  table td {
    white-space: pre-line !important;
  }
  blockquote {
    display: block !important;
  }
  .mdx-load-screen,
  .mdx-tool-tips,
  .mdx-info-tips {
    display: none !important;
  }
  .mdx-current-blockfocus-item {
    box-shadow: none !important;
  }
  #write .md-toc {
    display: block !important;
  }
  .mdx-header-current {
    background: none !important;
  }
  .mdx-header-current a {
    color: var(--fore-color) !important;
  }
  .mdx-toc {
    display: block !important;
    visibility: visible !important;
  }
  .mdx-toolbar,
  .mdx-chapter-nav,
  .mdx-toc-panel,
  .mdx-toc-panel-header,
  .mdx-toc-panel-body-scroll {
    display: none;
    visibility: hidden;
  }
  #write > h6:first-of-type,
  #write > h6:last-of-type,
  #write > h6:first-of-type strong,
  #write > h6:first-of-type em {
    background: #FFFFFF none !important;
    color: #181A1E !important;
  }
}
@media (prefers-color-scheme: dark) {
  :root {
    --vlook-color-scheme: "dark";
    --vlook-invert-in-dark: invert(1);
    --bg-color: var(--doc-bg-color-dark);
    --side-bar-bg-color: var(--doc-bg-color-dark);
    --text-color: var(--fore-color-dark);
    --select-text-bg-color: rgba(0, 168, 190, 0.5);
    --control-text-color: var(--fore-color-dark);
    --control-text-hover-color: var(--fore-color-dark);
    --window-border: 1px solid var(--doc-bg-color-alt-dark);
    --active-file-bg-color: var(--doc-bg-color-dark);
    --active-file-border-color: var(--select-text-bg-color);
    --active-file-text-color: var(--fore-color-dark);
    --item-hover-bg-color: var(--fore-color-alt-dark);
    --item-hover-text-color: var(--fore-color-dark);
    --primary-color: #00A8BE;
    --rawblock-edit-panel-bd: var(--doc-bg-color-dark);
    --search-select-bg-color: rgba(0, 168, 190, 0.5);
    --doc-bg-color: var(--doc-bg-color-dark);
    --doc-bg-color-alt: var(--doc-bg-color-alt-dark);
    --doc-bg-color-transparent: var(--doc-bg-color-transparent-dark);
    --doc-bg-color-alt-transparent: var(--doc-bg-color-alt-transparent-dark);
    --fore-color: var(--fore-color-dark);
    --fore-color-alt: var(--fore-color-alt-dark);
    --tips-bg-color: var(--tips-bg-color-dark);
    --tips-bg-color-inset: var(--tips-bg-color-inset-dark);
    --shadow-color: var(--shadow-color-dark);
    --a-color: var(--a-color-dark);
    --table-color: var(--table-color-dark);
    --table-border-color: var(--table-border-color-dark);
    --table-th-bg-color: var(--table-th-bg-color-dark);
    --table-th-border-color: var(--table-th-border-color-dark);
    --del-color: var(--del-color-dark);
    --toc-header-num-color: var(--toc-header-num-color-dark);
    --header-color: var(--header-color-dark);
    --header-box-shadow: var(--header-box-shadow-dark);
    --header-bg-start-color: var(--header-bg-start-color-dark);
    --header-bg-end-color: var(--header-bg-end-color-dark);
    --code-bg-color: var(--code-bg-color-dark);
    --code-name-bg-color: var(--code-name-bg-color-dark);
    --code-name-shadow-color: var(--code-name-shadow-color-dark);
    --accent-color1: var(--accent-color1-dark);
    --accent-color2: var(--accent-color2-dark);
    --accent-color3: var(--accent-color3-dark);
    --accent-color4: var(--accent-color4-dark);
    --accent-color5: var(--accent-color5-dark);
    --accent-color6: var(--accent-color6-dark);
    --mermaid-accent-color1: var(--mermaid-accent-color1-dark);
    --mermaid-accent-color1-alt: var(--mermaid-accent-color1-alt-dark);
    --mermaid-accent-color2: var(--mermaid-accent-color2-dark);
    --mermaid-accent-color2-alt: var(--mermaid-accent-color2-alt-dark);
    --mermaid-accent-color3: var(--mermaid-accent-color3-dark);
    --mermaid-accent-color3-alt: var(--mermaid-accent-color3-alt-dark);
    --mermaid-accent-color4: var(--mermaid-accent-color4-dark);
    --mermaid-accent-color4-alt: var(--mermaid-accent-color4-alt-dark);
    --mermaid-accent-color5: var(--mermaid-accent-color5-dark);
    --mermaid-accent-color5-alt: var(--mermaid-accent-color5-alt-dark);
    --mermaid-accent-color6: var(--mermaid-accent-color6-dark);
    --mermaid-accent-color6-alt: var(--mermaid-accent-color6-alt-dark);
    --cm-keyword: var(--cm-keyword-dark);
    --cm-variable: var(--cm-variable-dark);
    --cm-variable-2: var(--cm-variable-2-dark);
    --cm-variable-3: var(--cm-variable-3-dark);
    --cm-tag: var(--cm-tag-dark);
    --cm-attribute: var(--cm-attribute-dark);
    --cm-CodeMirror-cursor: var(--cm-CodeMirror-cursor-dark);
    --cm-string: var(--cm-string-dark);
    --cm-string-2: var(--cm-string-2-dark);
    --cm-comment: var(--cm-comment-dark);
    --cm-header: var(--cm-header-dark);
    --cm-quote: var(--cm-quote-dark);
    --cm-hr: var(--cm-hr-dark);
    --cm-link: var(--cm-link-dark);
    --cm-negative: var(--cm-negative-dark);
    --cm-positive: var(--cm-positive-dark);
    --cm-meta: var(--cm-meta-dark);
    --cm-bulidin: var(--cm-bulidin-dark);
    --cm-bracket: var(--cm-bracket-dark);
    --cm-atom: var(--cm-atom-dark);
    --cm-number: var(--cm-atom-dark);
  }
  .md-diagram-panel svg,
  .mdx-figure-content svg {
    background-image: url("");
  }
  img {
    background-image: url("") !important;
  }
  img[src*="invert=in-dark"] {
    filter: var(--vlook-invert-in-dark);
    border-color: rgba(175, 173, 169, 0.8) !important;
    background-image: url("") !important;
  }
}
@supports ((backdrop-filter: blur(15px)) or
    (-webkit-backdrop-filter: blur(15px))) {
}
:root {
  --mermaid-font-family: "Noto Serif CJK SC", "Times New Roman", Times, SimSun, "宋体", "Songti SC", "宋体-简", STZhongsong, "华文中宋", serif !important;
  --mermaid-alt-font-family: "Noto Serif CJK SC", "Times New Roman", Times, SimSun, "宋体", "Songti SC", "宋体-简", STZhongsong, "华文中宋", serif !important;
}


 .typora-export li, .typora-export p, .typora-export,  .footnote-line {white-space: normal;} 
</style>
</head>
<body class='typora-export' >
<!--========================================================================-->
<!--                                                                        -->
<!--                       VLOOK V9.19 - Typora Plugin                      -->
<!--                                                                        -->
<!--                               2020-06-14                               -->
<!--                          powered by MAX丨孟兆                           -->
<!--                                                                        -->
<!--                          QQ Group: 805502564                           -->
<!--                         email: maxchow@qq.com                          -->
<!--                                                                        -->
<!--                  https://github.com/MadMaxChow/VLOOK                   -->
<!--                                                                        -->
<!--========================================================================-->
<!--

MIT License

Copyright (c) 2018-2020 MAX°DESIGN | Max Chow
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

MIT许可证（MIT）

版权所有 (c) 2018-2020 MAX°DESIGN | Max Chow
在此授予任何获得此软件和相关文档文件（“软件”）副本的人免费许可，以无限制地处理本软件，包括但不限于使用，复制，修改，合并，发布，分发，再授权和/或出售本软件的副本，并允许本软件的授予人员遵从以下情况：
上述版权声明和本许可声明应包含在本软件的所有副本或重要部分中。
本软件按“原样”提供，不提供任何以表达或暗示，包括但不限于销售，适用于特定用途和不侵权的保证。在任何情况下，作者或版权所有人不对因软件或软件的使用或其他事宜产生的任何索赔，损害或其他责任（无论是在合同，侵权或其他方面的诉讼中）负责。

-->
<!--      !!!NOTE!!! NEED NETWORKING      -->
<!--<script src="https://code.jquery.com/jquery-3.4.1.js"></script>-->
<!--<script src="https://code.jquery.com/jquery-3.4.1.min.js"></script>-->
<!--   !!!NOTE!!! DON'T NEED NETWORKING   -->
<script type="text/javascript">
    /*! jQuery v3.4.1 | (c) JS Foundation and other contributors | jquery.org/license */
    !function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],E=C.document,r=Object.getPrototypeOf,s=t.slice,g=t.concat,u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},x=function(e){return null!=e&&e===e.window},c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.4.1",k=function(e,t){return new k.fn.init(e,t)},p=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;function d(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0<t&&t-1 in e)}k.fn=k.prototype={jquery:f,constructor:k,length:0,toArray:function(){return s.call(this)},get:function(e){return null==e?s.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=k.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return k.each(this,e)},map:function(n){return this.pushStack(k.map(this,function(e,t){return n.call(e,t,e)}))},slice:function(){return this.pushStack(s.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(0<=n&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:u,sort:t.sort,splice:t.splice},k.extend=k.fn.extend=function(){var e,t,n,r,i,o,a=arguments[0]||{},s=1,u=arguments.length,l=!1;for("boolean"==typeof a&&(l=a,a=arguments[s]||{},s++),"object"==typeof a||m(a)||(a={}),s===u&&(a=this,s--);s<u;s++)if(null!=(e=arguments[s]))for(t in e)r=e[t],"__proto__"!==t&&a!==r&&(l&&r&&(k.isPlainObject(r)||(i=Array.isArray(r)))?(n=a[t],o=i&&!Array.isArray(n)?[]:i||k.isPlainObject(n)?n:{},i=!1,a[t]=k.extend(l,o,r)):void 0!==r&&(a[t]=r));return a},k.extend({expando:"jQuery"+(f+Math.random()).replace(/\D/g,""),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isPlainObject:function(e){var t,n;return!(!e||"[object Object]"!==o.call(e))&&(!(t=r(e))||"function"==typeof(n=v.call(t,"constructor")&&t.constructor)&&a.call(n)===l)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},globalEval:function(e,t){b(e,{nonce:t&&t.nonce})},each:function(e,t){var n,r=0;if(d(e)){for(n=e.length;r<n;r++)if(!1===t.call(e[r],r,e[r]))break}else for(r in e)if(!1===t.call(e[r],r,e[r]))break;return e},trim:function(e){return null==e?"":(e+"").replace(p,"")},makeArray:function(e,t){var n=t||[];return null!=e&&(d(Object(e))?k.merge(n,"string"==typeof e?[e]:e):u.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:i.call(t,e,n)},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;r<n;r++)e[i++]=t[r];return e.length=i,e},grep:function(e,t,n){for(var r=[],i=0,o=e.length,a=!n;i<o;i++)!t(e[i],i)!==a&&r.push(e[i]);return r},map:function(e,t,n){var r,i,o=0,a=[];if(d(e))for(r=e.length;o<r;o++)null!=(i=t(e[o],o,n))&&a.push(i);else for(o in e)null!=(i=t(e[o],o,n))&&a.push(i);return g.apply([],a)},guid:1,support:y}),"function"==typeof Symbol&&(k.fn[Symbol.iterator]=t[Symbol.iterator]),k.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(e,t){n["[object "+t+"]"]=t.toLowerCase()});var h=function(n){var e,d,b,o,i,h,f,g,w,u,l,T,C,a,E,v,s,c,y,k="sizzle"+1*new Date,m=n.document,S=0,r=0,p=ue(),x=ue(),N=ue(),A=ue(),D=function(e,t){return e===t&&(l=!0),0},j={}.hasOwnProperty,t=[],q=t.pop,L=t.push,H=t.push,O=t.slice,P=function(e,t){for(var n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1},R="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",I="(?:\\\\.|[\\w-]|[^\0-\\xa0])+",W="\\["+M+"*("+I+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+I+"))|)"+M+"*\\]",$=":("+I+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+W+")*)|.*)\\)|)",F=new RegExp(M+"+","g"),B=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),_=new RegExp("^"+M+"*,"+M+"*"),z=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp($),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+$),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),ne=function(e,t,n){var r="0x"+t-65536;return r!=r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(m.childNodes),m.childNodes),t[m.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&((e?e.ownerDocument||e:m)!==C&&T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!A[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&U.test(t)){(s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=k),o=(l=h(t)).length;while(o--)l[o]="#"+s+" "+xe(l[o]);c=l.join(","),f=ee.test(t)&&ye(e.parentNode)||e}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){A(t,!0)}finally{s===k&&e.removeAttribute("id")}}}return g(t.replace(B,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[k]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:m;return r!==C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),m!==C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=k,!C.getElementsByName||!C.getElementsByName(k).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){a.appendChild(e).innerHTML="<a id='"+k+"'></a><select id='"+k+"-\r\\' msallowcapture=''><option selected=''></option></select>",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+k+"-]").length||v.push("~="),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+k+"+*").length||v.push(".#.+[+~]")}),ce(function(e){e.innerHTML="<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",$)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e===C||e.ownerDocument===m&&y(m,e)?-1:t===C||t.ownerDocument===m&&y(m,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e===C?-1:t===C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]===m?-1:s[r]===m?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if((e.ownerDocument||e)!==C&&T(e),d.matchesSelector&&E&&!A[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){A(t,!0)}return 0<se(t,C,null,[e]).length},se.contains=function(e,t){return(e.ownerDocument||e)!==C&&T(e),y(e,t)},se.attr=function(e,t){(e.ownerDocument||e)!==C&&T(e);var n=b.attrHandle[t.toLowerCase()],r=n&&j.call(b.attrHandle,t.toLowerCase())?n(e,t,!E):void 0;return void 0!==r?r:d.attributes||!E?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},se.escape=function(e){return(e+"").replace(re,ie)},se.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},se.uniqueSort=function(e){var t,n=[],r=0,i=0;if(l=!d.detectDuplicates,u=!d.sortStable&&e.slice(0),e.sort(D),l){while(t=e[i++])t===e[i]&&(r=n.push(i));while(r--)e.splice(n[r],1)}return u=null,e},o=se.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else while(t=e[r++])n+=o(t);return n},(b=se.selectors={cacheLength:50,createPseudo:le,match:G,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=p[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&p(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1<t.indexOf(i):"$="===r?i&&t.slice(-i.length)===i:"~="===r?-1<(" "+t.replace(F," ")+" ").indexOf(i):"|="===r&&(t===i||t.slice(0,i.length+1)===i+"-"))}},CHILD:function(h,e,t,g,v){var y="nth"!==h.slice(0,3),m="last"!==h.slice(-4),x="of-type"===e;return 1===g&&0===v?function(e){return!!e.parentNode}:function(e,t,n){var r,i,o,a,s,u,l=y!==m?"nextSibling":"previousSibling",c=e.parentNode,f=x&&e.nodeName.toLowerCase(),p=!n&&!x,d=!1;if(c){if(y){while(l){a=e;while(a=a[l])if(x?a.nodeName.toLowerCase()===f:1===a.nodeType)return!1;u=l="only"===h&&!u&&"nextSibling"}return!0}if(u=[m?c.firstChild:c.lastChild],m&&p){d=(s=(r=(i=(o=(a=c)[k]||(a[k]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===S&&r[1])&&r[2],a=s&&c.childNodes[s];while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if(1===a.nodeType&&++d&&a===e){i[h]=[S,s,d];break}}else if(p&&(d=s=(r=(i=(o=(a=e)[k]||(a[k]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===S&&r[1]),!1===d)while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if((x?a.nodeName.toLowerCase()===f:1===a.nodeType)&&++d&&(p&&((i=(o=a[k]||(a[k]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]=[S,d]),a===e))break;return(d-=v)===g||d%g==0&&0<=d/g}}},PSEUDO:function(e,o){var t,a=b.pseudos[e]||b.setFilters[e.toLowerCase()]||se.error("unsupported pseudo: "+e);return a[k]?a(o):1<a.length?(t=[e,e,"",o],b.setFilters.hasOwnProperty(e.toLowerCase())?le(function(e,t){var n,r=a(e,o),i=r.length;while(i--)e[n=P(e,r[i])]=!(t[n]=r[i])}):function(e){return a(e,0,t)}):a}},pseudos:{not:le(function(e){var r=[],i=[],s=f(e.replace(B,"$1"));return s[k]?le(function(e,t,n,r){var i,o=s(e,null,r,[]),a=e.length;while(a--)(i=o[a])&&(e[a]=!(t[a]=i))}):function(e,t,n){return r[0]=e,s(r,null,n,i),r[0]=null,!i.pop()}}),has:le(function(t){return function(e){return 0<se(t,e).length}}),contains:le(function(t){return t=t.replace(te,ne),function(e){return-1<(e.textContent||o(e)).indexOf(t)}}),lang:le(function(n){return V.test(n||"")||se.error("unsupported lang: "+n),n=n.replace(te,ne).toLowerCase(),function(e){var t;do{if(t=E?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(t=t.toLowerCase())===n||0===t.indexOf(n+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}}),target:function(e){var t=n.location&&n.location.hash;return t&&t.slice(1)===e.id},root:function(e){return e===a},focus:function(e){return e===C.activeElement&&(!C.hasFocus||C.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:ge(!1),disabled:ge(!0),checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!b.pseudos.empty(e)},header:function(e){return J.test(e.nodeName)},input:function(e){return Q.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:ve(function(){return[0]}),last:ve(function(e,t){return[t-1]}),eq:ve(function(e,t,n){return[n<0?n+t:n]}),even:ve(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:ve(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:ve(function(e,t,n){for(var r=n<0?n+t:t<n?t:n;0<=--spotlightR;)e.push(r);return e}),gt:ve(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}}).pseudos.nth=b.pseudos.eq,{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})b.pseudos[e]=de(e);for(e in{submit:!0,reset:!0})b.pseudos[e]=he(e);function me(){}function xe(e){for(var t=0,n=e.length,r="";t<n;t++)r+=e[t].value;return r}function be(s,e,t){var u=e.dir,l=e.next,c=l||u,f=t&&"parentNode"===c,p=r++;return e.first?function(e,t,n){while(e=e[u])if(1===e.nodeType||f)return s(e,t,n);return!1}:function(e,t,n){var r,i,o,a=[S,p];if(n){while(e=e[u])if((1===e.nodeType||f)&&s(e,t,n))return!0}else while(e=e[u])if(1===e.nodeType||f)if(i=(o=e[k]||(e[k]={}))[e.uniqueID]||(o[e.uniqueID]={}),l&&l===e.nodeName.toLowerCase())e=e[u]||e;else{if((r=i[c])&&r[0]===S&&r[1]===p)return a[2]=r[2];if((i[c]=a)[2]=s(e,t,n))return!0}return!1}}function we(i){return 1<i.length?function(e,t,n){var r=i.length;while(r--)if(!i[r](e,t,n))return!1;return!0}:i[0]}function Te(e,t,n,r,i){for(var o,a=[],s=0,u=e.length,l=null!=t;s<u;s++)(o=e[s])&&(n&&!n(o,r,i)||(a.push(o),l&&t.push(s)));return a}function Ce(d,h,g,v,y,e){return v&&!v[k]&&(v=Ce(v)),y&&!y[k]&&(y=Ce(y,e)),le(function(e,t,n,r){var i,o,a,s=[],u=[],l=t.length,c=e||function(e,t,n){for(var r=0,i=t.length;r<i;r++)se(e,t[r],n);return n}(h||"*",n.nodeType?[n]:n,[]),f=!d||!e&&h?c:Te(c,s,d,n,r),p=g?y||(e?d:l||v)?[]:t:f;if(g&&g(f,p,n,r),v){i=Te(p,u),v(i,[],n,r),o=i.length;while(o--)(a=i[o])&&(p[u[o]]=!(f[u[o]]=a))}if(e){if(y||d){if(y){i=[],o=p.length;while(o--)(a=p[o])&&i.push(f[o]=a);y(null,p=[],i,r)}o=p.length;while(o--)(a=p[o])&&-1<(i=y?P(e,a):s[o])&&(e[i]=!(t[i]=a))}}else p=Te(p===t?p.splice(l,p.length):p),y?y(null,t,p,r):H.apply(t,p)})}function Ee(e){for(var i,t,n,r=e.length,o=b.relative[e[0].type],a=o||b.relative[" "],s=o?1:0,u=be(function(e){return e===i},a,!0),l=be(function(e){return-1<P(i,e)},a,!0),c=[function(e,t,n){var r=!o&&(n||t!==w)||((i=t).nodeType?u(e,t,n):l(e,t,n));return i=null,r}];s<r;s++)if(t=b.relative[e[s].type])c=[be(we(c),t)];else{if((t=b.filter[e[s].type].apply(null,e[s].matches))[k]){for(n=++s;n<r;n++)if(b.relative[e[n].type])break;return Ce(1<s&&we(c),1<s&&xe(e.slice(0,s-1).concat({value:" "===e[s-2].type?"*":""})).replace(B,"$1"),t,s<n&&Ee(e.slice(s,n)),n<r&&Ee(e=e.slice(n)),n<r&&xe(e))}c.push(t)}return we(c)}return me.prototype=b.filters=b.pseudos,b.setFilters=new me,h=se.tokenize=function(e,t){var n,r,i,o,a,s,u,l=x[e+" "];if(l)return t?0:l.slice(0);a=e,s=[],u=b.preFilter;while(a){for(o in n&&!(r=_.exec(a))||(r&&(a=a.slice(r[0].length)||a),s.push(i=[])),n=!1,(r=z.exec(a))&&(n=r.shift(),i.push({value:n,type:r[0].replace(B," ")}),a=a.slice(n.length)),b.filter)!(r=G[o].exec(a))||u[o]&&!(r=u[o](r))||(n=r.shift(),i.push({value:n,type:o,matches:r}),a=a.slice(n.length));if(!n)break}return t?a.length:a?se.error(e):x(e,s).slice(0)},f=se.compile=function(e,t){var n,v,y,m,x,r,i=[],o=[],a=N[e+" "];if(!a){t||(t=h(e)),n=t.length;while(n--)(a=Ee(t[n]))[k]?i.push(a):o.push(a);(a=N(e,(v=o,m=0<(y=i).length,x=0<v.length,r=function(e,t,n,r,i){var o,a,s,u=0,l="0",c=e&&[],f=[],p=w,d=e||x&&b.find.TAG("*",i),h=S+=null==p?1:Math.random()||.1,g=d.length;for(i&&(w=t===C||t||i);l!==g&&null!=(o=d[l]);l++){if(x&&o){a=0,t||o.ownerDocument===C||(T(o),n=!E);while(s=v[a++])if(s(o,t||C,n)){r.push(o);break}i&&(S=h)}m&&((o=!s&&o)&&u--,e&&c.push(o))}if(u+=l,m&&l!==u){a=0;while(s=y[a++])s(c,f,t,n);if(e){if(0<u)while(l--)c[l]||f[l]||(f[l]=q.call(r));f=Te(f)}H.apply(r,f),i&&!e&&0<f.length&&1<u+y.length&&se.uniqueSort(r)}return i&&(S=h,w=p),c},m?le(r):r))).selector=e}return a},g=se.select=function(e,t,n,r){var i,o,a,s,u,l="function"==typeof e&&e,c=!r&&h(e=l.selector||e);if(n=n||[],1===c.length){if(2<(o=c[0]=c[0].slice(0)).length&&"ID"===(a=o[0]).type&&9===t.nodeType&&E&&b.relative[o[1].type]){if(!(t=(b.find.ID(a.matches[0].replace(te,ne),t)||[])[0]))return n;l&&(t=t.parentNode),e=e.slice(o.shift().value.length)}i=G.needsContext.test(e)?0:o.length;while(i--){if(a=o[i],b.relative[s=a.type])break;if((u=b.find[s])&&(r=u(a.matches[0].replace(te,ne),ee.test(o[0].type)&&ye(t.parentNode)||t))){if(o.splice(i,1),!(e=r.length&&xe(o)))return H.apply(n,r),n;break}}}return(l||f(e,c))(r,t,!E,n,!t||ee.test(e)&&ye(t.parentNode)||t),n},d.sortStable=k.split("").sort(D).join("")===k,d.detectDuplicates=!!l,T(),d.sortDetached=ce(function(e){return 1&e.compareDocumentPosition(C.createElement("fieldset"))}),ce(function(e){return e.innerHTML="<a href='#'></a>","#"===e.firstChild.getAttribute("href")})||fe("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),d.attributes&&ce(function(e){return e.innerHTML="<input/>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||fe("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),ce(function(e){return null==e.getAttribute("disabled")})||fe(R,function(e,t,n){var r;if(!n)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),se}(C);k.find=h,k.expr=h.selectors,k.expr[":"]=k.expr.pseudos,k.uniqueSort=k.unique=h.uniqueSort,k.text=h.getText,k.isXMLDoc=h.isXML,k.contains=h.contains,k.escapeSelector=h.escape;var T=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&k(e).is(n))break;r.push(e)}return r},S=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},N=k.expr.match.needsContext;function A(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var D=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?k.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?k.grep(e,function(e){return e===n!==r}):"string"!=typeof n?k.grep(e,function(e){return-1<i.call(n,e)!==r}):k.filter(n,e,r)}k.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?k.find.matchesSelector(r,e)?[r]:[]:k.find.matches(e,k.grep(t,function(e){return 1===e.nodeType}))},k.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(k(e).filter(function(){for(t=0;t<r;t++)if(k.contains(i[t],this))return!0}));for(n=this.pushStack([]),t=0;t<r;t++)k.find(e,i[t],n);return 1<r?k.uniqueSort(n):n},filter:function(e){return this.pushStack(j(this,e||[],!1))},not:function(e){return this.pushStack(j(this,e||[],!0))},is:function(e){return!!j(this,"string"==typeof e&&N.test(e)?k(e):e||[],!1).length}});var q,L=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(k.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:L.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof k?t[0]:t,k.merge(this,k.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),D.test(r[1])&&k.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(k):k.makeArray(e,this)}).prototype=k.fn,q=k(E);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}k.fn.extend({has:function(e){var t=k(e,this),n=t.length;return this.filter(function(){for(var e=0;e<n;e++)if(k.contains(this,t[e]))return!0})},closest:function(e,t){var n,r=0,i=this.length,o=[],a="string"!=typeof e&&k(e);if(!N.test(e))for(;r<i;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(n.nodeType<11&&(a?-1<a.index(n):1===n.nodeType&&k.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(1<o.length?k.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?i.call(k(e),this[0]):i.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(k.uniqueSort(k.merge(this.get(),k(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),k.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return T(e,"parentNode")},parentsUntil:function(e,t,n){return T(e,"parentNode",n)},next:function(e){return P(e,"nextSibling")},prev:function(e){return P(e,"previousSibling")},nextAll:function(e){return T(e,"nextSibling")},prevAll:function(e){return T(e,"previousSibling")},nextUntil:function(e,t,n){return T(e,"nextSibling",n)},prevUntil:function(e,t,n){return T(e,"previousSibling",n)},siblings:function(e){return S((e.parentNode||{}).firstChild,e)},children:function(e){return S(e.firstChild)},contents:function(e){return"undefined"!=typeof e.contentDocument?e.contentDocument:(A(e,"template")&&(e=e.content||e),k.merge([],e.childNodes))}},function(r,i){k.fn[r]=function(e,t){var n=k.map(this,i,e);return"Until"!==r.slice(-5)&&(t=e),t&&"string"==typeof t&&(n=k.filter(t,n)),1<this.length&&(O[r]||k.uniqueSort(n),H.test(r)&&n.reverse()),this.pushStack(n)}});var R=/[^\x20\t\r\n\f]+/g;function M(e){return e}function I(e){throw e}function W(e,t,n,r){var i;try{e&&m(i=e.promise)?i.call(e).done(t).fail(n):e&&m(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}k.Callbacks=function(r){var e,n;r="string"==typeof r?(e=r,n={},k.each(e.match(R)||[],function(e,t){n[t]=!0}),n):k.extend({},r);var i,t,o,a,s=[],u=[],l=-1,c=function(){for(a=a||r.once,o=i=!0;u.length;l=-1){t=u.shift();while(++l<s.length)!1===s[l].apply(t[0],t[1])&&r.stopOnFalse&&(l=s.length,t=!1)}r.memory||(t=!1),i=!1,a&&(s=t?[]:"")},f={add:function(){return s&&(t&&!i&&(l=s.length-1,u.push(t)),function n(e){k.each(e,function(e,t){m(t)?r.unique&&f.has(t)||s.push(t):t&&t.length&&"string"!==w(t)&&n(t)})}(arguments),t&&!i&&c()),this},remove:function(){return k.each(arguments,function(e,t){var n;while(-1<(n=k.inArray(t,s,n)))s.splice(n,1),n<=l&&l--}),this},has:function(e){return e?-1<k.inArray(e,s):0<s.length},empty:function(){return s&&(s=[]),this},disable:function(){return a=u=[],s=t="",this},disabled:function(){return!s},lock:function(){return a=u=[],t||i||(s=t=""),this},locked:function(){return!!a},fireWith:function(e,t){return a||(t=[e,(t=t||[]).slice?t.slice():t],u.push(t),i||c()),this},fire:function(){return f.fireWith(this,arguments),this},fired:function(){return!!o}};return f},k.extend({Deferred:function(e){var o=[["notify","progress",k.Callbacks("memory"),k.Callbacks("memory"),2],["resolve","done",k.Callbacks("once memory"),k.Callbacks("once memory"),0,"resolved"],["reject","fail",k.Callbacks("once memory"),k.Callbacks("once memory"),1,"rejected"]],i="pending",a={state:function(){return i},always:function(){return s.done(arguments).fail(arguments),this},"catch":function(e){return a.then(null,e)},pipe:function(){var i=arguments;return k.Deferred(function(r){k.each(o,function(e,t){var n=m(i[t[4]])&&i[t[4]];s[t[1]](function(){var e=n&&n.apply(this,arguments);e&&m(e.promise)?e.promise().progress(r.notify).done(r.resolve).fail(r.reject):r[t[0]+"With"](this,n?[e]:arguments)})}),i=null}).promise()},then:function(t,n,r){var u=0;function l(i,o,a,s){return function(){var n=this,r=arguments,e=function(){var e,t;if(!(i<u)){if((e=a.apply(n,r))===o.promise())throw new TypeError("Thenable self-resolution");t=e&&("object"==typeof e||"function"==typeof e)&&e.then,m(t)?s?t.call(e,l(u,o,M,s),l(u,o,I,s)):(u++,t.call(e,l(u,o,M,s),l(u,o,I,s),l(u,o,M,o.notifyWith))):(a!==M&&(n=void 0,r=[e]),(s||o.resolveWith)(n,r))}},t=s?e:function(){try{e()}catch(e){k.Deferred.exceptionHook&&k.Deferred.exceptionHook(e,t.stackTrace),u<=i+1&&(a!==I&&(n=void 0,r=[e]),o.rejectWith(n,r))}};i?t():(k.Deferred.getStackHook&&(t.stackTrace=k.Deferred.getStackHook()),C.setTimeout(t))}}return k.Deferred(function(e){o[0][3].add(l(0,e,m(r)?r:M,e.notifyWith)),o[1][3].add(l(0,e,m(t)?t:M)),o[2][3].add(l(0,e,m(n)?n:I))}).promise()},promise:function(e){return null!=e?k.extend(e,a):a}},s={};return k.each(o,function(e,t){var n=t[2],r=t[5];a[t[1]]=n.add,r&&n.add(function(){i=r},o[3-e][2].disable,o[3-e][3].disable,o[0][2].lock,o[0][3].lock),n.add(t[3].fire),s[t[0]]=function(){return s[t[0]+"With"](this===s?void 0:this,arguments),this},s[t[0]+"With"]=n.fireWith}),a.promise(s),e&&e.call(s,s),s},when:function(e){var n=arguments.length,t=n,r=Array(t),i=s.call(arguments),o=k.Deferred(),a=function(t){return function(e){r[t]=this,i[t]=1<arguments.length?s.call(arguments):e,--n||o.resolveWith(r,i)}};if(n<=1&&(W(e,o.done(a(t)).resolve,o.reject,!n),"pending"===o.state()||m(i[t]&&i[t].then)))return o.then();while(t--)W(i[t],a(t),o.reject);return o.promise()}});var $=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;k.Deferred.exceptionHook=function(e,t){C.console&&C.console.warn&&e&&$.test(e.name)&&C.console.warn("jQuery.Deferred exception: "+e.message,e.stack,t)},k.readyException=function(e){C.setTimeout(function(){throw e})};var F=k.Deferred();function B(){E.removeEventListener("DOMContentLoaded",B),C.removeEventListener("load",B),k.ready()}k.fn.ready=function(e){return F.then(e)["catch"](function(e){k.readyException(e)}),this},k.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--k.readyWait:k.isReady)||(k.isReady=!0)!==e&&0<--k.readyWait||F.resolveWith(E,[k])}}),k.ready.then=F.then,"complete"===E.readyState||"loading"!==E.readyState&&!E.documentElement.doScroll?C.setTimeout(k.ready):(E.addEventListener("DOMContentLoaded",B),C.addEventListener("load",B));var _=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===w(n))for(s in i=!0,n)_(e,t,s,n[s],!0,o,a);else if(void 0!==r&&(i=!0,m(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(k(e),n)})),t))for(;s<u;s++)t(e[s],n,a?r:r.call(e[s],s,t(e[s],n)));return i?e:l?t.call(e):u?t(e[0],n):o},z=/^-ms-/,U=/-([a-z])/g;function X(e,t){return t.toUpperCase()}function V(e){return e.replace(z,"ms-").replace(U,X)}var G=function(e){return 1===e.nodeType||9===e.nodeType||!+e.nodeType};function Y(){this.expando=k.expando+Y.uid++}Y.uid=1,Y.prototype={cache:function(e){var t=e[this.expando];return t||(t={},G(e)&&(e.nodeType?e[this.expando]=t:Object.defineProperty(e,this.expando,{value:t,configurable:!0}))),t},set:function(e,t,n){var r,i=this.cache(e);if("string"==typeof t)i[V(t)]=n;else for(r in t)i[V(r)]=t[r];return i},get:function(e,t){return void 0===t?this.cache(e):e[this.expando]&&e[this.expando][V(t)]},access:function(e,t,n){return void 0===t||t&&"string"==typeof t&&void 0===n?this.get(e,t):(this.set(e,t,n),void 0!==n?n:t)},remove:function(e,t){var n,r=e[this.expando];if(void 0!==r){if(void 0!==t){n=(t=Array.isArray(t)?t.map(V):(t=V(t))in r?[t]:t.match(R)||[]).length;while(n--)delete r[t[n]]}(void 0===t||k.isEmptyObject(r))&&(e.nodeType?e[this.expando]=void 0:delete e[this.expando])}},hasData:function(e){var t=e[this.expando];return void 0!==t&&!k.isEmptyObject(t)}};var Q=new Y,J=new Y,K=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,Z=/[A-Z]/g;function ee(e,t,n){var r,i;if(void 0===n&&1===e.nodeType)if(r="data-"+t.replace(Z,"-$&").toLowerCase(),"string"==typeof(n=e.getAttribute(r))){try{n="true"===(i=n)||"false"!==i&&("null"===i?null:i===+i+""?+i:K.test(i)?JSON.parse(i):i)}catch(e){}J.set(e,t,n)}else n=void 0;return n}k.extend({hasData:function(e){return J.hasData(e)||Q.hasData(e)},data:function(e,t,n){return J.access(e,t,n)},removeData:function(e,t){J.remove(e,t)},_data:function(e,t,n){return Q.access(e,t,n)},_removeData:function(e,t){Q.remove(e,t)}}),k.fn.extend({data:function(n,e){var t,r,i,o=this[0],a=o&&o.attributes;if(void 0===n){if(this.length&&(i=J.get(o),1===o.nodeType&&!Q.get(o,"hasDataAttrs"))){t=a.length;while(t--)a[t]&&0===(r=a[t].name).indexOf("data-")&&(r=V(r.slice(5)),ee(o,r,i[r]));Q.set(o,"hasDataAttrs",!0)}return i}return"object"==typeof n?this.each(function(){J.set(this,n)}):_(this,function(e){var t;if(o&&void 0===e)return void 0!==(t=J.get(o,n))?t:void 0!==(t=ee(o,n))?t:void 0;this.each(function(){J.set(this,n,e)})},null,e,1<arguments.length,null,!0)},removeData:function(e){return this.each(function(){J.remove(this,e)})}}),k.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=Q.get(e,t),n&&(!r||Array.isArray(n)?r=Q.access(e,t,k.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=k.queue(e,t),r=n.length,i=n.shift(),o=k._queueHooks(e,t);"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,function(){k.dequeue(e,t)},o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return Q.get(e,n)||Q.access(e,n,{empty:k.Callbacks("once memory").add(function(){Q.remove(e,[t+"queue",n])})})}}),k.fn.extend({queue:function(t,n){var e=2;return"string"!=typeof t&&(n=t,t="fx",e--),arguments.length<e?k.queue(this[0],t):void 0===n?this:this.each(function(){var e=k.queue(this,t,n);k._queueHooks(this,t),"fx"===t&&"inprogress"!==e[0]&&k.dequeue(this,t)})},dequeue:function(e){return this.each(function(){k.dequeue(this,e)})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,t){var n,r=1,i=k.Deferred(),o=this,a=this.length,s=function(){--spotlightR||i.resolveWith(o,[o])};"string"!=typeof e&&(t=e,e=void 0),e=e||"fx";while(a--)(n=Q.get(o[a],e+"queueHooks"))&&n.empty&&(r++,n.empty.add(s));return s(),i.promise(t)}});var te=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,ne=new RegExp("^(?:([+-])=|)("+te+")([a-z%]*)$","i"),re=["Top","Right","Bottom","Left"],ie=E.documentElement,oe=function(e){return k.contains(e.ownerDocument,e)},ae={composed:!0};ie.getRootNode&&(oe=function(e){return k.contains(e.ownerDocument,e)||e.getRootNode(ae)===e.ownerDocument});var se=function(e,t){return"none"===(e=t||e).style.display||""===e.style.display&&oe(e)&&"none"===k.css(e,"display")},ue=function(e,t,n,r){var i,o,a={};for(o in t)a[o]=e.style[o],e.style[o]=t[o];for(o in i=n.apply(e,r||[]),t)e.style[o]=a[o];return i};function le(e,t,n,r){var i,o,a=20,s=r?function(){return r.cur()}:function(){return k.css(e,t,"")},u=s(),l=n&&n[3]||(k.cssNumber[t]?"":"px"),c=e.nodeType&&(k.cssNumber[t]||"px"!==l&&+u)&&ne.exec(k.css(e,t));if(c&&c[3]!==l){u/=2,l=l||c[3],c=+u||1;while(a--)k.style(e,t,c+l),(1-o)*(1-(o=s()/u||.5))<=0&&(a=0),c/=o;c*=2,k.style(e,t,c+l),n=n||[]}return n&&(c=+c||+u||0,i=n[1]?c+(n[1]+1)*n[2]:+n[2],r&&(r.unit=l,r.start=c,r.end=i)),i}var ce={};function fe(e,t){for(var n,r,i,o,a,s,u,l=[],c=0,f=e.length;c<f;c++)(r=e[c]).style&&(n=r.style.display,t?("none"===n&&(l[c]=Q.get(r,"display")||null,l[c]||(r.style.display="")),""===r.style.display&&se(r)&&(l[c]=(u=a=o=void 0,a=(i=r).ownerDocument,s=i.nodeName,(u=ce[s])||(o=a.body.appendChild(a.createElement(s)),u=k.css(o,"display"),o.parentNode.removeChild(o),"none"===u&&(u="block"),ce[s]=u)))):"none"!==n&&(l[c]="none",Q.set(r,"display",n)));for(c=0;c<f;c++)null!=l[c]&&(e[c].style.display=l[c]);return e}k.fn.extend({show:function(){return fe(this,!0)},hide:function(){return fe(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){se(this)?k(this).show():k(this).hide()})}});var pe=/^(?:checkbox|radio)$/i,de=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i,ge={option:[1,"<select multiple='multiple'>","</select>"],thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?k.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n<r;n++)Q.set(e[n],"globalEval",!t||Q.get(t[n],"globalEval"))}ge.optgroup=ge.option,ge.tbody=ge.tfoot=ge.colgroup=ge.caption=ge.thead,ge.th=ge.td;var me,xe,be=/<|&#?\w+;/;function we(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d<h;d++)if((o=e[d])||0===o)if("object"===w(o))k.merge(p,o.nodeType?[o]:o);else if(be.test(o)){a=a||f.appendChild(t.createElement("div")),s=(de.exec(o)||["",""])[1].toLowerCase(),u=ge[s]||ge._default,a.innerHTML=u[1]+k.htmlPrefilter(o)+u[2],c=u[0];while(c--)a=a.lastChild;k.merge(p,a.childNodes),(a=f.firstChild).textContent=""}else p.push(t.createTextNode(o));f.textContent="",d=0;while(o=p[d++])if(r&&-1<k.inArray(o,r))i&&i.push(o);else if(l=oe(o),a=ve(f.appendChild(o),"script"),l&&ye(a),n){c=0;while(o=a[c++])he.test(o.type||"")&&n.push(o)}return f}me=E.createDocumentFragment().appendChild(E.createElement("div")),(xe=E.createElement("input")).setAttribute("type","radio"),xe.setAttribute("checked","checked"),xe.setAttribute("name","t"),me.appendChild(xe),y.checkClone=me.cloneNode(!0).cloneNode(!0).lastChild.checked,me.innerHTML="<textarea>x</textarea>",y.noCloneChecked=!!me.cloneNode(!0).lastChild.defaultValue;var Te=/^key/,Ce=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ee=/^([^.]*)(?:\.(.+)|)/;function ke(){return!0}function Se(){return!1}function Ne(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ae(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ae(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Se;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return k().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=k.guid++)),e.each(function(){k.event.add(this,t,i,r,n)})}function De(e,i,o){o?(Q.set(e,i,!1),k.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Q.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(k.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Q.set(this,i,r),t=o(this,i),this[i](),r!==(n=Q.get(this,i))||t?Q.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Q.set(this,i,{value:k.event.trigger(k.extend(r[0],k.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Q.get(e,i)&&k.event.add(e,i,ke)}k.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.get(t);if(v){n.handler&&(n=(o=n).handler,i=o.selector),i&&k.find.matchesSelector(ie,i),n.guid||(n.guid=k.guid++),(u=v.events)||(u=v.events={}),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof k&&k.event.triggered!==e.type?k.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(R)||[""]).length;while(l--)d=g=(s=Ee.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=k.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=k.event.special[d]||{},c=k.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&k.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),k.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.hasData(e)&&Q.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(R)||[""]).length;while(l--)if(d=g=(s=Ee.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=k.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||k.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)k.event.remove(e,d+t[l],n,r,!0);k.isEmptyObject(u)&&Q.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=k.event.fix(e),u=new Array(arguments.length),l=(Q.get(this,"events")||{})[s.type]||[],c=k.event.special[s.type]||{};for(u[0]=s,t=1;t<arguments.length;t++)u[t]=arguments[t];if(s.delegateTarget=this,!c.preDispatch||!1!==c.preDispatch.call(this,s)){a=k.event.handlers.call(this,s,l),t=0;while((i=a[t++])&&!s.isPropagationStopped()){s.currentTarget=i.elem,n=0;while((o=i.handlers[n++])&&!s.isImmediatePropagationStopped())s.rnamespace&&!1!==o.namespace&&!s.rnamespace.test(o.namespace)||(s.handleObj=o,s.data=o.data,void 0!==(r=((k.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,u))&&!1===(s.result=r)&&(s.preventDefault(),s.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,s),s.result}},handlers:function(e,t){var n,r,i,o,a,s=[],u=t.delegateCount,l=e.target;if(u&&l.nodeType&&!("click"===e.type&&1<=e.button))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n<u;n++)void 0===a[i=(r=t[n]).selector+" "]&&(a[i]=r.needsContext?-1<k(i,this).index(l):k.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u<t.length&&s.push({elem:l,handlers:t.slice(u)}),s},addProp:function(t,e){Object.defineProperty(k.Event.prototype,t,{enumerable:!0,configurable:!0,get:m(e)?function(){if(this.originalEvent)return e(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[t]},set:function(e){Object.defineProperty(this,t,{enumerable:!0,configurable:!0,writable:!0,value:e})}})},fix:function(e){return e[k.expando]?e:new k.Event(e)},special:{load:{noBubble:!0},click:{setup:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&De(t,"click",ke),!1},trigger:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&De(t,"click"),!0},_default:function(e){var t=e.target;return pe.test(t.type)&&t.click&&A(t,"input")&&Q.get(t,"click")||A(t,"a")}},beforeunload:{postDispatch:function(e){void 0!==e.result&&e.originalEvent&&(e.originalEvent.returnValue=e.result)}}}},k.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n)},k.Event=function(e,t){if(!(this instanceof k.Event))return new k.Event(e,t);e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||void 0===e.defaultPrevented&&!1===e.returnValue?ke:Se,this.target=e.target&&3===e.target.nodeType?e.target.parentNode:e.target,this.currentTarget=e.currentTarget,this.relatedTarget=e.relatedTarget):this.type=e,t&&k.extend(this,t),this.timeStamp=e&&e.timeStamp||Date.now(),this[k.expando]=!0},k.Event.prototype={constructor:k.Event,isDefaultPrevented:Se,isPropagationStopped:Se,isImmediatePropagationStopped:Se,isSimulated:!1,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=ke,e&&!this.isSimulated&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=ke,e&&!this.isSimulated&&e.stopPropagation()},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=ke,e&&!this.isSimulated&&e.stopImmediatePropagation(),this.stopPropagation()}},k.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,"char":!0,code:!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:function(e){var t=e.button;return null==e.which&&Te.test(e.type)?null!=e.charCode?e.charCode:e.keyCode:!e.which&&void 0!==t&&Ce.test(e.type)?1&t?1:2&t?3:4&t?2:0:e.which}},k.event.addProp),k.each({focus:"focusin",blur:"focusout"},function(e,t){k.event.special[e]={setup:function(){return De(this,e,Ne),!1},trigger:function(){return De(this,e),!0},delegateType:t}}),k.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(e,i){k.event.special[e]={delegateType:i,bindType:i,handle:function(e){var t,n=e.relatedTarget,r=e.handleObj;return n&&(n===this||k.contains(this,n))||(e.type=r.origType,t=r.handler.apply(this,arguments),e.type=i),t}}}),k.fn.extend({on:function(e,t,n,r){return Ae(this,e,t,n,r)},one:function(e,t,n,r){return Ae(this,e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,k(e.delegateTarget).off(r.namespace?r.origType+"."+r.namespace:r.origType,r.selector,r.handler),this;if("object"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return!1!==t&&"function"!=typeof t||(n=t,t=void 0),!1===n&&(n=Se),this.each(function(){k.event.remove(this,e,n,t)})}});var je=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi,qe=/<script|<style|<link/i,Le=/checked\s*(?:[^=]|=\s*.checked.)/i,He=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;function Oe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&k(e).children("tbody")[0]||e}function Pe(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Re(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Me(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(Q.hasData(e)&&(o=Q.access(e),a=Q.set(t,o),l=o.events))for(i in delete a.handle,a.events={},l)for(n=0,r=l[i].length;n<r;n++)k.event.add(t,i,l[i][n]);J.hasData(e)&&(s=J.access(e),u=k.extend({},s),J.set(t,u))}}function Ie(n,r,i,o){r=g.apply([],r);var e,t,a,s,u,l,c=0,f=n.length,p=f-1,d=r[0],h=m(d);if(h||1<f&&"string"==typeof d&&!y.checkClone&&Le.test(d))return n.each(function(e){var t=n.eq(e);h&&(r[0]=d.call(this,e,t.html())),Ie(t,r,i,o)});if(f&&(t=(e=we(r,n[0].ownerDocument,!1,n,o)).firstChild,1===e.childNodes.length&&(e=t),t||o)){for(s=(a=k.map(ve(e,"script"),Pe)).length;c<f;c++)u=e,c!==p&&(u=k.clone(u,!0,!0),s&&k.merge(a,ve(u,"script"))),i.call(n[c],u,c);if(s)for(l=a[a.length-1].ownerDocument,k.map(a,Re),c=0;c<s;c++)u=a[c],he.test(u.type||"")&&!Q.access(u,"globalEval")&&k.contains(l,u)&&(u.src&&"module"!==(u.type||"").toLowerCase()?k._evalUrl&&!u.noModule&&k._evalUrl(u.src,{nonce:u.nonce||u.getAttribute("nonce")}):b(u.textContent.replace(He,""),u,l))}return n}function We(e,t,n){for(var r,i=t?k.filter(t,e):e,o=0;null!=(r=i[o]);o++)n||1!==r.nodeType||k.cleanData(ve(r)),r.parentNode&&(n&&oe(r)&&ye(ve(r,"script")),r.parentNode.removeChild(r));return e}k.extend({htmlPrefilter:function(e){return e.replace(je,"<$1></$2>")},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=oe(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||k.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r<i;r++)s=o[r],u=a[r],void 0,"input"===(l=u.nodeName.toLowerCase())&&pe.test(s.type)?u.checked=s.checked:"input"!==l&&"textarea"!==l||(u.defaultValue=s.defaultValue);if(t)if(n)for(o=o||ve(e),a=a||ve(c),r=0,i=o.length;r<i;r++)Me(o[r],a[r]);else Me(e,c);return 0<(a=ve(c,"script")).length&&ye(a,!f&&ve(e,"script")),c},cleanData:function(e){for(var t,n,r,i=k.event.special,o=0;void 0!==(n=e[o]);o++)if(G(n)){if(t=n[Q.expando]){if(t.events)for(r in t.events)i[r]?k.event.remove(n,r):k.removeEvent(n,r,t.handle);n[Q.expando]=void 0}n[J.expando]&&(n[J.expando]=void 0)}}}),k.fn.extend({detach:function(e){return We(this,e,!0)},remove:function(e){return We(this,e)},text:function(e){return _(this,function(e){return void 0===e?k.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return Ie(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||Oe(this,e).appendChild(e)})},prepend:function(){return Ie(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Oe(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return Ie(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return Ie(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(k.cleanData(ve(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return k.clone(this,e,t)})},html:function(e){return _(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!qe.test(e)&&!ge[(de.exec(e)||["",""])[1].toLowerCase()]){e=k.htmlPrefilter(e);try{for(;n<r;n++)1===(t=this[n]||{}).nodeType&&(k.cleanData(ve(t,!1)),t.innerHTML=e);t=0}catch(e){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var n=[];return Ie(this,arguments,function(e){var t=this.parentNode;k.inArray(this,n)<0&&(k.cleanData(ve(this)),t&&t.replaceChild(e,this))},n)}}),k.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,a){k.fn[e]=function(e){for(var t,n=[],r=k(e),i=r.length-1,o=0;o<=i;o++)t=o===i?this:this.clone(!0),k(r[o])[a](t),u.apply(n,t.get());return this.pushStack(n)}});var $e=new RegExp("^("+te+")(?!px)[a-z%]+$","i"),Fe=function(e){var t=e.ownerDocument.defaultView;return t&&t.opener||(t=C),t.getComputedStyle(e)},Be=new RegExp(re.join("|"),"i");function _e(e,t,n){var r,i,o,a,s=e.style;return(n=n||Fe(e))&&(""!==(a=n.getPropertyValue(t)||n[t])||oe(e)||(a=k.style(e,t)),!y.pixelBoxStyles()&&$e.test(a)&&Be.test(t)&&(r=s.width,i=s.minWidth,o=s.maxWidth,s.minWidth=s.maxWidth=s.width=a,a=n.width,s.width=r,s.minWidth=i,s.maxWidth=o)),void 0!==a?a+"":a}function ze(e,t){return{get:function(){if(!e())return(this.get=t).apply(this,arguments);delete this.get}}}!function(){function e(){if(u){s.style.cssText="position:absolute;left:-11111px;width:60px;margin-top:1px;padding:0;border:0",u.style.cssText="position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%",ie.appendChild(s).appendChild(u);var e=C.getComputedStyle(u);n="1%"!==e.top,a=12===t(e.marginLeft),u.style.right="60%",o=36===t(e.right),r=36===t(e.width),u.style.position="absolute",i=12===t(u.offsetWidth/3),ie.removeChild(s),u=null}}function t(e){return Math.round(parseFloat(e))}var n,r,i,o,a,s=E.createElement("div"),u=E.createElement("div");u.style&&(u.style.backgroundClip="content-box",u.cloneNode(!0).style.backgroundClip="",y.clearCloneStyle="content-box"===u.style.backgroundClip,k.extend(y,{boxSizingReliable:function(){return e(),r},pixelBoxStyles:function(){return e(),o},pixelPosition:function(){return e(),n},reliableMarginLeft:function(){return e(),a},scrollboxSize:function(){return e(),i}}))}();var Ue=["Webkit","Moz","ms"],Xe=E.createElement("div").style,Ve={};function Ge(e){var t=k.cssProps[e]||Ve[e];return t||(e in Xe?e:Ve[e]=function(e){var t=e[0].toUpperCase()+e.slice(1),n=Ue.length;while(n--)if((e=Ue[n]+t)in Xe)return e}(e)||e)}var Ye=/^(none|table(?!-c[ea]).+)/,Qe=/^--/,Je={position:"absolute",visibility:"hidden",display:"block"},Ke={letterSpacing:"0",fontWeight:"400"};function Ze(e,t,n){var r=ne.exec(t);return r?Math.max(0,r[2]-(n||0))+(r[3]||"px"):t}function et(e,t,n,r,i,o){var a="width"===t?1:0,s=0,u=0;if(n===(r?"border":"content"))return 0;for(;a<4;a+=2)"margin"===n&&(u+=k.css(e,n+re[a],!0,i)),r?("content"===n&&(u-=k.css(e,"padding"+re[a],!0,i)),"margin"!==n&&(u-=k.css(e,"border"+re[a]+"Width",!0,i))):(u+=k.css(e,"padding"+re[a],!0,i),"padding"!==n?u+=k.css(e,"border"+re[a]+"Width",!0,i):s+=k.css(e,"border"+re[a]+"Width",!0,i));return!r&&0<=o&&(u+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))||0),u}function tt(e,t,n){var r=Fe(e),i=(!y.boxSizingReliable()||n)&&"border-box"===k.css(e,"boxSizing",!1,r),o=i,a=_e(e,t,r),s="offset"+t[0].toUpperCase()+t.slice(1);if($e.test(a)){if(!n)return a;a="auto"}return(!y.boxSizingReliable()&&i||"auto"===a||!parseFloat(a)&&"inline"===k.css(e,"display",!1,r))&&e.getClientRects().length&&(i="border-box"===k.css(e,"boxSizing",!1,r),(o=s in e)&&(a=e[s])),(a=parseFloat(a)||0)+et(e,t,n||(i?"border":"content"),o,r,a)+"px"}function nt(e,t,n,r,i){return new nt.prototype.init(e,t,n,r,i)}k.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=_e(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=V(t),u=Qe.test(t),l=e.style;if(u||(t=Ge(s)),a=k.cssHooks[t]||k.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];"string"===(o=typeof n)&&(i=ne.exec(n))&&i[1]&&(n=le(e,t,i),o="number"),null!=n&&n==n&&("number"!==o||u||(n+=i&&i[3]||(k.cssNumber[s]?"":"px")),y.clearCloneStyle||""!==n||0!==t.indexOf("background")||(l[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(u?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,s=V(t);return Qe.test(t)||(t=Ge(s)),(a=k.cssHooks[t]||k.cssHooks[s])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=_e(e,t,r)),"normal"===i&&t in Ke&&(i=Ke[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),k.each(["height","width"],function(e,u){k.cssHooks[u]={get:function(e,t,n){if(t)return!Ye.test(k.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?tt(e,u,n):ue(e,Je,function(){return tt(e,u,n)})},set:function(e,t,n){var r,i=Fe(e),o=!y.scrollboxSize()&&"absolute"===i.position,a=(o||n)&&"border-box"===k.css(e,"boxSizing",!1,i),s=n?et(e,u,n,a,i):0;return a&&o&&(s-=Math.ceil(e["offset"+u[0].toUpperCase()+u.slice(1)]-parseFloat(i[u])-et(e,u,"border",!1,i)-.5)),s&&(r=ne.exec(t))&&"px"!==(r[3]||"px")&&(e.style[u]=t,t=k.css(e,u)),Ze(0,t,s)}}}),k.cssHooks.marginLeft=ze(y.reliableMarginLeft,function(e,t){if(t)return(parseFloat(_e(e,"marginLeft"))||e.getBoundingClientRect().left-ue(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),k.each({margin:"",padding:"",border:"Width"},function(i,o){k.cssHooks[i+o]={expand:function(e){for(var t=0,n={},r="string"==typeof e?e.split(" "):[e];t<4;t++)n[i+re[t]+o]=r[t]||r[t-2]||r[0];return n}},"margin"!==i&&(k.cssHooks[i+o].set=Ze)}),k.fn.extend({css:function(e,t){return _(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=Fe(e),i=t.length;a<i;a++)o[t[a]]=k.css(e,t[a],!1,r);return o}return void 0!==n?k.style(e,t,n):k.css(e,t)},e,t,1<arguments.length)}}),((k.Tween=nt).prototype={constructor:nt,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||k.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(k.cssNumber[n]?"":"px")},cur:function(){var e=nt.propHooks[this.prop];return e&&e.get?e.get(this):nt.propHooks._default.get(this)},run:function(e){var t,n=nt.propHooks[this.prop];return this.options.duration?this.pos=t=k.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):nt.propHooks._default.set(this),this}}).init.prototype=nt.prototype,(nt.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=k.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){k.fx.step[e.prop]?k.fx.step[e.prop](e):1!==e.elem.nodeType||!k.cssHooks[e.prop]&&null==e.elem.style[Ge(e.prop)]?e.elem[e.prop]=e.now:k.style(e.elem,e.prop,e.now+e.unit)}}}).scrollTop=nt.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},k.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},k.fx=nt.prototype.init,k.fx.step={};var rt,it,ot,at,st=/^(?:toggle|show|hide)$/,ut=/queueHooks$/;function lt(){it&&(!1===E.hidden&&C.requestAnimationFrame?C.requestAnimationFrame(lt):C.setTimeout(lt,k.fx.interval),k.fx.tick())}function ct(){return C.setTimeout(function(){rt=void 0}),rt=Date.now()}function ft(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin"+(n=re[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function pt(e,t,n){for(var r,i=(dt.tweeners[t]||[]).concat(dt.tweeners["*"]),o=0,a=i.length;o<a;o++)if(r=i[o].call(n,t,e))return r}function dt(o,e,t){var n,a,r=0,i=dt.prefilters.length,s=k.Deferred().always(function(){delete u.elem}),u=function(){if(a)return!1;for(var e=rt||ct(),t=Math.max(0,l.startTime+l.duration-e),n=1-(t/l.duration||0),r=0,i=l.tweens.length;r<i;r++)l.tweens[r].run(n);return s.notifyWith(o,[l,n,t]),n<1&&i?t:(i||s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l]),!1)},l=s.promise({elem:o,props:k.extend({},e),opts:k.extend(!0,{specialEasing:{},easing:k.easing._default},t),originalProperties:e,originalOptions:t,startTime:rt||ct(),duration:t.duration,tweens:[],createTween:function(e,t){var n=k.Tween(o,l.opts,e,t,l.opts.specialEasing[e]||l.opts.easing);return l.tweens.push(n),n},stop:function(e){var t=0,n=e?l.tweens.length:0;if(a)return this;for(a=!0;t<n;t++)l.tweens[t].run(1);return e?(s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l,e])):s.rejectWith(o,[l,e]),this}}),c=l.props;for(!function(e,t){var n,r,i,o,a;for(n in e)if(i=t[r=V(n)],o=e[n],Array.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),(a=k.cssHooks[r])&&"expand"in a)for(n in o=a.expand(o),delete e[r],o)n in e||(e[n]=o[n],t[n]=i);else t[r]=i}(c,l.opts.specialEasing);r<i;r++)if(n=dt.prefilters[r].call(l,o,c,l.opts))return m(n.stop)&&(k._queueHooks(l.elem,l.opts.queue).stop=n.stop.bind(n)),n;return k.map(c,pt,l),m(l.opts.start)&&l.opts.start.call(o,l),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always),k.fx.timer(k.extend(u,{elem:o,anim:l,queue:l.opts.queue})),l}k.Animation=k.extend(dt,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return le(n.elem,e,ne.exec(t),n),n}]},tweener:function(e,t){m(e)?(t=e,e=["*"]):e=e.match(R);for(var n,r=0,i=e.length;r<i;r++)n=e[r],dt.tweeners[n]=dt.tweeners[n]||[],dt.tweeners[n].unshift(t)},prefilters:[function(e,t,n){var r,i,o,a,s,u,l,c,f="width"in t||"height"in t,p=this,d={},h=e.style,g=e.nodeType&&se(e),v=Q.get(e,"fxshow");for(r in n.queue||(null==(a=k._queueHooks(e,"fx")).unqueued&&(a.unqueued=0,s=a.empty.fire,a.empty.fire=function(){a.unqueued||s()}),a.unqueued++,p.always(function(){p.always(function(){a.unqueued--,k.queue(e,"fx").length||a.empty.fire()})})),t)if(i=t[r],st.test(i)){if(delete t[r],o=o||"toggle"===i,i===(g?"hide":"show")){if("show"!==i||!v||void 0===v[r])continue;g=!0}d[r]=v&&v[r]||k.style(e,r)}if((u=!k.isEmptyObject(t))||!k.isEmptyObject(d))for(r in f&&1===e.nodeType&&(n.overflow=[h.overflow,h.overflowX,h.overflowY],null==(l=v&&v.display)&&(l=Q.get(e,"display")),"none"===(c=k.css(e,"display"))&&(l?c=l:(fe([e],!0),l=e.style.display||l,c=k.css(e,"display"),fe([e]))),("inline"===c||"inline-block"===c&&null!=l)&&"none"===k.css(e,"float")&&(u||(p.done(function(){h.display=l}),null==l&&(c=h.display,l="none"===c?"":c)),h.display="inline-block")),n.overflow&&(h.overflow="hidden",p.always(function(){h.overflow=n.overflow[0],h.overflowX=n.overflow[1],h.overflowY=n.overflow[2]})),u=!1,d)u||(v?"hidden"in v&&(g=v.hidden):v=Q.access(e,"fxshow",{display:l}),o&&(v.hidden=!g),g&&fe([e],!0),p.done(function(){for(r in g||fe([e]),Q.remove(e,"fxshow"),d)k.style(e,r,d[r])})),u=pt(g?v[r]:0,r,p),r in v||(v[r]=u.start,g&&(u.end=u.start,u.start=0))}],prefilter:function(e,t){t?dt.prefilters.unshift(e):dt.prefilters.push(e)}}),k.speed=function(e,t,n){var r=e&&"object"==typeof e?k.extend({},e):{complete:n||!n&&t||m(e)&&e,duration:e,easing:n&&t||t&&!m(t)&&t};return k.fx.off?r.duration=0:"number"!=typeof r.duration&&(r.duration in k.fx.speeds?r.duration=k.fx.speeds[r.duration]:r.duration=k.fx.speeds._default),null!=r.queue&&!0!==r.queue||(r.queue="fx"),r.old=r.complete,r.complete=function(){m(r.old)&&r.old.call(this),r.queue&&k.dequeue(this,r.queue)},r},k.fn.extend({fadeTo:function(e,t,n,r){return this.filter(se).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(t,e,n,r){var i=k.isEmptyObject(t),o=k.speed(e,n,r),a=function(){var e=dt(this,k.extend({},t),o);(i||Q.get(this,"finish"))&&e.stop(!0)};return a.finish=a,i||!1===o.queue?this.each(a):this.queue(o.queue,a)},stop:function(i,e,o){var a=function(e){var t=e.stop;delete e.stop,t(o)};return"string"!=typeof i&&(o=e,e=i,i=void 0),e&&!1!==i&&this.queue(i||"fx",[]),this.each(function(){var e=!0,t=null!=i&&i+"queueHooks",n=k.timers,r=Q.get(this);if(t)r[t]&&r[t].stop&&a(r[t]);else for(t in r)r[t]&&r[t].stop&&ut.test(t)&&a(r[t]);for(t=n.length;t--;)n[t].elem!==this||null!=i&&n[t].queue!==i||(n[t].anim.stop(o),e=!1,n.splice(t,1));!e&&o||k.dequeue(this,i)})},finish:function(a){return!1!==a&&(a=a||"fx"),this.each(function(){var e,t=Q.get(this),n=t[a+"queue"],r=t[a+"queueHooks"],i=k.timers,o=n?n.length:0;for(t.finish=!0,k.queue(this,a,[]),r&&r.stop&&r.stop.call(this,!0),e=i.length;e--;)i[e].elem===this&&i[e].queue===a&&(i[e].anim.stop(!0),i.splice(e,1));for(e=0;e<o;e++)n[e]&&n[e].finish&&n[e].finish.call(this);delete t.finish})}}),k.each(["toggle","show","hide"],function(e,r){var i=k.fn[r];k.fn[r]=function(e,t,n){return null==e||"boolean"==typeof e?i.apply(this,arguments):this.animate(ft(r,!0),e,t,n)}}),k.each({slideDown:ft("show"),slideUp:ft("hide"),slideToggle:ft("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,r){k.fn[e]=function(e,t,n){return this.animate(r,e,t,n)}}),k.timers=[],k.fx.tick=function(){var e,t=0,n=k.timers;for(rt=Date.now();t<n.length;t++)(e=n[t])()||n[t]!==e||n.splice(t--,1);n.length||k.fx.stop(),rt=void 0},k.fx.timer=function(e){k.timers.push(e),k.fx.start()},k.fx.interval=13,k.fx.start=function(){it||(it=!0,lt())},k.fx.stop=function(){it=null},k.fx.speeds={slow:600,fast:200,_default:400},k.fn.delay=function(r,e){return r=k.fx&&k.fx.speeds[r]||r,e=e||"fx",this.queue(e,function(e,t){var n=C.setTimeout(e,r);t.stop=function(){C.clearTimeout(n)}})},ot=E.createElement("input"),at=E.createElement("select").appendChild(E.createElement("option")),ot.type="checkbox",y.checkOn=""!==ot.value,y.optSelected=at.selected,(ot=E.createElement("input")).value="t",ot.type="radio",y.radioValue="t"===ot.value;var ht,gt=k.expr.attrHandle;k.fn.extend({attr:function(e,t){return _(this,k.attr,e,t,1<arguments.length)},removeAttr:function(e){return this.each(function(){k.removeAttr(this,e)})}}),k.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?k.prop(e,t,n):(1===o&&k.isXMLDoc(e)||(i=k.attrHooks[t.toLowerCase()]||(k.expr.match.bool.test(t)?ht:void 0)),void 0!==n?null===n?void k.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=k.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!y.radioValue&&"radio"===t&&A(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(R);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),ht={set:function(e,t,n){return!1===t?k.removeAttr(e,n):e.setAttribute(n,n),n}},k.each(k.expr.match.bool.source.match(/\w+/g),function(e,t){var a=gt[t]||k.find.attr;gt[t]=function(e,t,n){var r,i,o=t.toLowerCase();return n||(i=gt[o],gt[o]=r,r=null!=a(e,t,n)?o:null,gt[o]=i),r}});var vt=/^(?:input|select|textarea|button)$/i,yt=/^(?:a|area)$/i;function mt(e){return(e.match(R)||[]).join(" ")}function xt(e){return e.getAttribute&&e.getAttribute("class")||""}function bt(e){return Array.isArray(e)?e:"string"==typeof e&&e.match(R)||[]}k.fn.extend({prop:function(e,t){return _(this,k.prop,e,t,1<arguments.length)},removeProp:function(e){return this.each(function(){delete this[k.propFix[e]||e]})}}),k.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&k.isXMLDoc(e)||(t=k.propFix[t]||t,i=k.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=k.find.attr(e,"tabindex");return t?parseInt(t,10):vt.test(e.nodeName)||yt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),y.optSelected||(k.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),k.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){k.propFix[this.toLowerCase()]=this}),k.fn.extend({addClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){k(this).addClass(t.call(this,e,xt(this)))});if((e=bt(t)).length)while(n=this[u++])if(i=xt(n),r=1===n.nodeType&&" "+mt(i)+" "){a=0;while(o=e[a++])r.indexOf(" "+o+" ")<0&&(r+=o+" ");i!==(s=mt(r))&&n.setAttribute("class",s)}return this},removeClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){k(this).removeClass(t.call(this,e,xt(this)))});if(!arguments.length)return this.attr("class","");if((e=bt(t)).length)while(n=this[u++])if(i=xt(n),r=1===n.nodeType&&" "+mt(i)+" "){a=0;while(o=e[a++])while(-1<r.indexOf(" "+o+" "))r=r.replace(" "+o+" "," ");i!==(s=mt(r))&&n.setAttribute("class",s)}return this},toggleClass:function(i,t){var o=typeof i,a="string"===o||Array.isArray(i);return"boolean"==typeof t&&a?t?this.addClass(i):this.removeClass(i):m(i)?this.each(function(e){k(this).toggleClass(i.call(this,e,xt(this),t),t)}):this.each(function(){var e,t,n,r;if(a){t=0,n=k(this),r=bt(i);while(e=r[t++])n.hasClass(e)?n.removeClass(e):n.addClass(e)}else void 0!==i&&"boolean"!==o||((e=xt(this))&&Q.set(this,"__className__",e),this.setAttribute&&this.setAttribute("class",e||!1===i?"":Q.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;t=" "+e+" ";while(n=this[r++])if(1===n.nodeType&&-1<(" "+mt(xt(n))+" ").indexOf(t))return!0;return!1}});var wt=/\r/g;k.fn.extend({val:function(n){var r,e,i,t=this[0];return arguments.length?(i=m(n),this.each(function(e){var t;1===this.nodeType&&(null==(t=i?n.call(this,e,k(this).val()):n)?t="":"number"==typeof t?t+="":Array.isArray(t)&&(t=k.map(t,function(e){return null==e?"":e+""})),(r=k.valHooks[this.type]||k.valHooks[this.nodeName.toLowerCase()])&&"set"in r&&void 0!==r.set(this,t,"value")||(this.value=t))})):t?(r=k.valHooks[t.type]||k.valHooks[t.nodeName.toLowerCase()])&&"get"in r&&void 0!==(e=r.get(t,"value"))?e:"string"==typeof(e=t.value)?e.replace(wt,""):null==e?"":e:void 0}}),k.extend({valHooks:{option:{get:function(e){var t=k.find.attr(e,"value");return null!=t?t:mt(k.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a="select-one"===e.type,s=a?null:[],u=a?o+1:i.length;for(r=o<0?u:a?o:0;r<u;r++)if(((n=i[r]).selected||r===o)&&!n.disabled&&(!n.parentNode.disabled||!A(n.parentNode,"optgroup"))){if(t=k(n).val(),a)return t;s.push(t)}return s},set:function(e,t){var n,r,i=e.options,o=k.makeArray(t),a=i.length;while(a--)((r=i[a]).selected=-1<k.inArray(k.valHooks.option.get(r),o))&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),k.each(["radio","checkbox"],function(){k.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=-1<k.inArray(k(e).val(),t)}},y.checkOn||(k.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})}),y.focusin="onfocusin"in C;var Tt=/^(?:focusinfocus|focusoutblur)$/,Ct=function(e){e.stopPropagation()};k.extend(k.event,{trigger:function(e,t,n,r){var i,o,a,s,u,l,c,f,p=[n||E],d=v.call(e,"type")?e.type:e,h=v.call(e,"namespace")?e.namespace.split("."):[];if(o=f=a=n=n||E,3!==n.nodeType&&8!==n.nodeType&&!Tt.test(d+k.event.triggered)&&(-1<d.indexOf(".")&&(d=(h=d.split(".")).shift(),h.sort()),u=d.indexOf(":")<0&&"on"+d,(e=e[k.expando]?e:new k.Event(d,"object"==typeof e&&e)).isTrigger=r?2:3,e.namespace=h.join("."),e.rnamespace=e.namespace?new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,e.result=void 0,e.target||(e.target=n),t=null==t?[e]:k.makeArray(t,[e]),c=k.event.special[d]||{},r||!c.trigger||!1!==c.trigger.apply(n,t))){if(!r&&!c.noBubble&&!x(n)){for(s=c.delegateType||d,Tt.test(s+d)||(o=o.parentNode);o;o=o.parentNode)p.push(o),a=o;a===(n.ownerDocument||E)&&p.push(a.defaultView||a.parentWindow||C)}i=0;while((o=p[i++])&&!e.isPropagationStopped())f=o,e.type=1<i?s:c.bindType||d,(l=(Q.get(o,"events")||{})[e.type]&&Q.get(o,"handle"))&&l.apply(o,t),(l=u&&o[u])&&l.apply&&G(o)&&(e.result=l.apply(o,t),!1===e.result&&e.preventDefault());return e.type=d,r||e.isDefaultPrevented()||c._default&&!1!==c._default.apply(p.pop(),t)||!G(n)||u&&m(n[d])&&!x(n)&&((a=n[u])&&(n[u]=null),k.event.triggered=d,e.isPropagationStopped()&&f.addEventListener(d,Ct),n[d](),e.isPropagationStopped()&&f.removeEventListener(d,Ct),k.event.triggered=void 0,a&&(n[u]=a)),e.result}},simulate:function(e,t,n){var r=k.extend(new k.Event,n,{type:e,isSimulated:!0});k.event.trigger(r,null,t)}}),k.fn.extend({trigger:function(e,t){return this.each(function(){k.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return k.event.trigger(e,t,n,!0)}}),y.focusin||k.each({focus:"focusin",blur:"focusout"},function(n,r){var i=function(e){k.event.simulate(r,e.target,k.event.fix(e))};k.event.special[r]={setup:function(){var e=this.ownerDocument||this,t=Q.access(e,r);t||e.addEventListener(n,i,!0),Q.access(e,r,(t||0)+1)},teardown:function(){var e=this.ownerDocument||this,t=Q.access(e,r)-1;t?Q.access(e,r,t):(e.removeEventListener(n,i,!0),Q.remove(e,r))}}});var Et=C.location,kt=Date.now(),St=/\?/;k.parseXML=function(e){var t;if(!e||"string"!=typeof e)return null;try{t=(new C.DOMParser).parseFromString(e,"text/xml")}catch(e){t=void 0}return t&&!t.getElementsByTagName("parsererror").length||k.error("Invalid XML: "+e),t};var Nt=/\[\]$/,At=/\r?\n/g,Dt=/^(?:submit|button|image|reset|file)$/i,jt=/^(?:input|select|textarea|keygen)/i;function qt(n,e,r,i){var t;if(Array.isArray(e))k.each(e,function(e,t){r||Nt.test(n)?i(n,t):qt(n+"["+("object"==typeof t&&null!=t?e:"")+"]",t,r,i)});else if(r||"object"!==w(e))i(n,e);else for(t in e)qt(n+"["+t+"]",e[t],r,i)}k.param=function(e,t){var n,r=[],i=function(e,t){var n=m(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(null==e)return"";if(Array.isArray(e)||e.jquery&&!k.isPlainObject(e))k.each(e,function(){i(this.name,this.value)});else for(n in e)qt(n,e[n],t,i);return r.join("&")},k.fn.extend({serialize:function(){return k.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=k.prop(this,"elements");return e?k.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!k(this).is(":disabled")&&jt.test(this.nodeName)&&!Dt.test(e)&&(this.checked||!pe.test(e))}).map(function(e,t){var n=k(this).val();return null==n?null:Array.isArray(n)?k.map(n,function(e){return{name:t.name,value:e.replace(At,"\r\n")}}):{name:t.name,value:n.replace(At,"\r\n")}}).get()}});var Lt=/%20/g,Ht=/#.*$/,Ot=/([?&])_=[^&]*/,Pt=/^(.*?):[ \t]*([^\r\n]*)$/gm,Rt=/^(?:GET|HEAD)$/,Mt=/^\/\//,It={},Wt={},$t="*/".concat("*"),Ft=E.createElement("a");function Bt(o){return function(e,t){"string"!=typeof e&&(t=e,e="*");var n,r=0,i=e.toLowerCase().match(R)||[];if(m(t))while(n=i[r++])"+"===n[0]?(n=n.slice(1)||"*",(o[n]=o[n]||[]).unshift(t)):(o[n]=o[n]||[]).push(t)}}function _t(t,i,o,a){var s={},u=t===Wt;function l(e){var r;return s[e]=!0,k.each(t[e]||[],function(e,t){var n=t(i,o,a);return"string"!=typeof n||u||s[n]?u?!(r=n):void 0:(i.dataTypes.unshift(n),l(n),!1)}),r}return l(i.dataTypes[0])||!s["*"]&&l("*")}function zt(e,t){var n,r,i=k.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&k.extend(!0,e,r),e}Ft.href=Et.href,k.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Et.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(Et.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":$t,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":k.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?zt(zt(e,k.ajaxSettings),t):zt(k.ajaxSettings,e)},ajaxPrefilter:Bt(It),ajaxTransport:Bt(Wt),ajax:function(e,t){"object"==typeof e&&(t=e,e=void 0),t=t||{};var c,f,p,n,d,r,h,g,i,o,v=k.ajaxSetup({},t),y=v.context||v,m=v.context&&(y.nodeType||y.jquery)?k(y):k.event,x=k.Deferred(),b=k.Callbacks("once memory"),w=v.statusCode||{},a={},s={},u="canceled",T={readyState:0,getResponseHeader:function(e){var t;if(h){if(!n){n={};while(t=Pt.exec(p))n[t[1].toLowerCase()+" "]=(n[t[1].toLowerCase()+" "]||[]).concat(t[2])}t=n[e.toLowerCase()+" "]}return null==t?null:t.join(", ")},getAllResponseHeaders:function(){return h?p:null},setRequestHeader:function(e,t){return null==h&&(e=s[e.toLowerCase()]=s[e.toLowerCase()]||e,a[e]=t),this},overrideMimeType:function(e){return null==h&&(v.mimeType=e),this},statusCode:function(e){var t;if(e)if(h)T.always(e[T.status]);else for(t in e)w[t]=[w[t],e[t]];return this},abort:function(e){var t=e||u;return c&&c.abort(t),l(0,t),this}};if(x.promise(T),v.url=((e||v.url||Et.href)+"").replace(Mt,Et.protocol+"//"),v.type=t.method||t.type||v.method||v.type,v.dataTypes=(v.dataType||"*").toLowerCase().match(R)||[""],null==v.crossDomain){r=E.createElement("a");try{r.href=v.url,r.href=r.href,v.crossDomain=Ft.protocol+"//"+Ft.host!=r.protocol+"//"+r.host}catch(e){v.crossDomain=!0}}if(v.data&&v.processData&&"string"!=typeof v.data&&(v.data=k.param(v.data,v.traditional)),_t(It,v,t,T),h)return T;for(i in(g=k.event&&v.global)&&0==k.active++&&k.event.trigger("ajaxStart"),v.type=v.type.toUpperCase(),v.hasContent=!Rt.test(v.type),f=v.url.replace(Ht,""),v.hasContent?v.data&&v.processData&&0===(v.contentType||"").indexOf("application/x-www-form-urlencoded")&&(v.data=v.data.replace(Lt,"+")):(o=v.url.slice(f.length),v.data&&(v.processData||"string"==typeof v.data)&&(f+=(St.test(f)?"&":"?")+v.data,delete v.data),!1===v.cache&&(f=f.replace(Ot,"$1"),o=(St.test(f)?"&":"?")+"_="+kt+++o),v.url=f+o),v.ifModified&&(k.lastModified[f]&&T.setRequestHeader("If-Modified-Since",k.lastModified[f]),k.etag[f]&&T.setRequestHeader("If-None-Match",k.etag[f])),(v.data&&v.hasContent&&!1!==v.contentType||t.contentType)&&T.setRequestHeader("Content-Type",v.contentType),T.setRequestHeader("Accept",v.dataTypes[0]&&v.accepts[v.dataTypes[0]]?v.accepts[v.dataTypes[0]]+("*"!==v.dataTypes[0]?", "+$t+"; q=0.01":""):v.accepts["*"]),v.headers)T.setRequestHeader(i,v.headers[i]);if(v.beforeSend&&(!1===v.beforeSend.call(y,T,v)||h))return T.abort();if(u="abort",b.add(v.complete),T.done(v.success),T.fail(v.error),c=_t(Wt,v,t,T)){if(T.readyState=1,g&&m.trigger("ajaxSend",[T,v]),h)return T;v.async&&0<v.timeout&&(d=C.setTimeout(function(){T.abort("timeout")},v.timeout));try{h=!1,c.send(a,l)}catch(e){if(h)throw e;l(-1,e)}}else l(-1,"No Transport");function l(e,t,n,r){var i,o,a,s,u,l=t;h||(h=!0,d&&C.clearTimeout(d),c=void 0,p=r||"",T.readyState=0<e?4:0,i=200<=e&&e<300||304===e,n&&(s=function(e,t,n){var r,i,o,a,s=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}(v,T,n)),s=function(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(!(a=l[u+" "+o]||l["* "+o]))for(i in l)if((s=i.split(" "))[1]===o&&(a=l[u+" "+s[0]]||l["* "+s[0]])){!0===a?a=l[i]:!0!==l[i]&&(o=s[0],c.unshift(s[1]));break}if(!0!==a)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(e){return{state:"parsererror",error:a?e:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}(v,s,T,i),i?(v.ifModified&&((u=T.getResponseHeader("Last-Modified"))&&(k.lastModified[f]=u),(u=T.getResponseHeader("etag"))&&(k.etag[f]=u)),204===e||"HEAD"===v.type?l="nocontent":304===e?l="notmodified":(l=s.state,o=s.data,i=!(a=s.error))):(a=l,!e&&l||(l="error",e<0&&(e=0))),T.status=e,T.statusText=(t||l)+"",i?x.resolveWith(y,[o,l,T]):x.rejectWith(y,[T,l,a]),T.statusCode(w),w=void 0,g&&m.trigger(i?"ajaxSuccess":"ajaxError",[T,v,i?o:a]),b.fireWith(y,[T,l]),g&&(m.trigger("ajaxComplete",[T,v]),--k.active||k.event.trigger("ajaxStop")))}return T},getJSON:function(e,t,n){return k.get(e,t,n,"json")},getScript:function(e,t){return k.get(e,void 0,t,"script")}}),k.each(["get","post"],function(e,i){k[i]=function(e,t,n,r){return m(t)&&(r=r||n,n=t,t=void 0),k.ajax(k.extend({url:e,type:i,dataType:r,data:t,success:n},k.isPlainObject(e)&&e))}}),k._evalUrl=function(e,t){return k.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(e){k.globalEval(e,t)}})},k.fn.extend({wrapAll:function(e){var t;return this[0]&&(m(e)&&(e=e.call(this[0])),t=k(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(n){return m(n)?this.each(function(e){k(this).wrapInner(n.call(this,e))}):this.each(function(){var e=k(this),t=e.contents();t.length?t.wrapAll(n):e.append(n)})},wrap:function(t){var n=m(t);return this.each(function(e){k(this).wrapAll(n?t.call(this,e):t)})},unwrap:function(e){return this.parent(e).not("body").each(function(){k(this).replaceWith(this.childNodes)}),this}}),k.expr.pseudos.hidden=function(e){return!k.expr.pseudos.visible(e)},k.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},k.ajaxSettings.xhr=function(){try{return new C.XMLHttpRequest}catch(e){}};var Ut={0:200,1223:204},Xt=k.ajaxSettings.xhr();y.cors=!!Xt&&"withCredentials"in Xt,y.ajax=Xt=!!Xt,k.ajaxTransport(function(i){var o,a;if(y.cors||Xt&&!i.crossDomain)return{send:function(e,t){var n,r=i.xhr();if(r.open(i.type,i.url,i.async,i.username,i.password),i.xhrFields)for(n in i.xhrFields)r[n]=i.xhrFields[n];for(n in i.mimeType&&r.overrideMimeType&&r.overrideMimeType(i.mimeType),i.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest"),e)r.setRequestHeader(n,e[n]);o=function(e){return function(){o&&(o=a=r.onload=r.onerror=r.onabort=r.ontimeout=r.onreadystatechange=null,"abort"===e?r.abort():"error"===e?"number"!=typeof r.status?t(0,"error"):t(r.status,r.statusText):t(Ut[r.status]||r.status,r.statusText,"text"!==(r.responseType||"text")||"string"!=typeof r.responseText?{binary:r.response}:{text:r.responseText},r.getAllResponseHeaders()))}},r.onload=o(),a=r.onerror=r.ontimeout=o("error"),void 0!==r.onabort?r.onabort=a:r.onreadystatechange=function(){4===r.readyState&&C.setTimeout(function(){o&&a()})},o=o("abort");try{r.send(i.hasContent&&i.data||null)}catch(e){if(o)throw e}},abort:function(){o&&o()}}}),k.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),k.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return k.globalEval(e),e}}}),k.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),k.ajaxTransport("script",function(n){var r,i;if(n.crossDomain||n.scriptAttrs)return{send:function(e,t){r=k("<script>").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Vt,Gt=[],Yt=/(=)\?(?=&|$)|\?\?/;k.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Gt.pop()||k.expando+"_"+kt++;return this[e]=!0,e}}),k.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Yt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Yt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Yt,"$1"+r):!1!==e.jsonp&&(e.url+=(St.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||k.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?k(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Gt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Vt=E.implementation.createHTMLDocument("").body).innerHTML="<form></form><form></form>",2===Vt.childNodes.length),k.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=D.exec(e))?[t.createElement(i[1])]:(i=we([e],t,o),o&&o.length&&k(o).remove(),k.merge([],i.childNodes)));var r,i,o},k.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1<s&&(r=mt(e.slice(s)),e=e.slice(0,s)),m(t)?(n=t,t=void 0):t&&"object"==typeof t&&(i="POST"),0<a.length&&k.ajax({url:e,type:i||"GET",dataType:"html",data:t}).done(function(e){o=arguments,a.html(r?k("<div>").append(k.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},k.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){k.fn[t]=function(e){return this.on(t,e)}}),k.expr.pseudos.animated=function(t){return k.grep(k.timers,function(e){return t===e.elem}).length},k.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=k.css(e,"position"),c=k(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=k.css(e,"top"),u=k.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,k.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},k.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){k.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===k.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===k.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=k(e).offset()).top+=k.css(e,"borderTopWidth",!0),i.left+=k.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-k.css(r,"marginTop",!0),left:t.left-i.left-k.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===k.css(e,"position"))e=e.offsetParent;return e||ie})}}),k.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;k.fn[t]=function(e){return _(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),k.each(["top","left"],function(e,n){k.cssHooks[n]=ze(y.pixelPosition,function(e,t){if(t)return t=_e(e,n),$e.test(t)?k(e).position()[n]+"px":t})}),k.each({Height:"height",Width:"width"},function(a,s){k.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){k.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return _(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?k.css(e,t,i):k.style(e,t,n,i)},s,n?e:void 0,n)}})}),k.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){k.fn[n]=function(e,t){return 0<arguments.length?this.on(n,null,e,t):this.trigger(n)}}),k.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),k.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)}}),k.proxy=function(e,t){var n,r,i;if("string"==typeof t&&(n=e[t],t=e,e=n),m(e))return r=s.call(arguments,2),(i=function(){return e.apply(t||this,r.concat(s.call(arguments)))}).guid=e.guid=e.guid||k.guid++,i},k.holdReady=function(e){e?k.readyWait++:k.ready(!0)},k.isArray=Array.isArray,k.parseJSON=JSON.parse,k.nodeName=A,k.isFunction=m,k.isWindow=x,k.camelCase=V,k.type=w,k.now=Date.now,k.isNumeric=function(e){var t=k.type(e);return("number"===t||"string"===t)&&!isNaN(e-parseFloat(e))},"function"==typeof define&&define.amd&&define("jquery",[],function(){return k});var Qt=C.jQuery,Jt=C.$;return k.noConflict=function(e){return C.$===k&&(C.$=Jt),e&&C.jQuery===k&&(C.jQuery=Qt),k},e||(C.jQuery=C.$=k),k});
</script>
<script type="text/javascript">
    /*! VelocityJS.org (1.5.2). (C) 2014 Julian Shapiro. MIT @license: en.wikipedia.org/wiki/MIT_License */
    /*! VelocityJS.org jQuery Shim (1.0.1). (C) 2014 The jQuery Foundation. MIT @license: en.wikipedia.org/wiki/MIT_License. */
    !function(a){"use strict";function b(a){var b=a.length,d=c.type(a);return"function"!==d&&!c.isWindow(a)&&(!(1!==a.nodeType||!b)||("array"===d||0===b||"number"==typeof b&&b>0&&b-1 in a))}if(!a.jQuery){var c=function(a,b){return new c.fn.init(a,b)};c.isWindow=function(a){return a&&a===a.window},c.type=function(a){return a?"object"==typeof a||"function"==typeof a?e[g.call(a)]||"object":typeof a:a+""},c.isArray=Array.isArray||function(a){return"array"===c.type(a)},c.isPlainObject=function(a){var b;if(!a||"object"!==c.type(a)||a.nodeType||c.isWindow(a))return!1;try{if(a.constructor&&!f.call(a,"constructor")&&!f.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(d){return!1}for(b in a);return b===undefined||f.call(a,b)},c.each=function(a,c,d){var e=0,f=a.length,g=b(a);if(d){if(g)for(;e<f&&!1!==c.apply(a[e],d);e++);else for(e in a)if(a.hasOwnProperty(e)&&!1===c.apply(a[e],d))break}else if(g)for(;e<f&&!1!==c.call(a[e],e,a[e]);e++);else for(e in a)if(a.hasOwnProperty(e)&&!1===c.call(a[e],e,a[e]))break;return a},c.data=function(a,b,e){if(e===undefined){var f=a[c.expando],g=f&&d[f];if(b===undefined)return g;if(g&&b in g)return g[b]}else if(b!==undefined){var h=a[c.expando]||(a[c.expando]=++c.uuid);return d[h]=d[h]||{},d[h][b]=e,e}},c.removeData=function(a,b){var e=a[c.expando],f=e&&d[e];f&&(b?c.each(b,function(a,b){delete f[b]}):delete d[e])},c.extend=function(){var a,b,d,e,f,g,h=arguments[0]||{},i=1,j=arguments.length,k=!1;for("boolean"==typeof h&&(k=h,h=arguments[i]||{},i++),"object"!=typeof h&&"function"!==c.type(h)&&(h={}),i===j&&(h=this,i--);i<j;i++)if(f=arguments[i])for(e in f)f.hasOwnProperty(e)&&(a=h[e],d=f[e],h!==d&&(k&&d&&(c.isPlainObject(d)||(b=c.isArray(d)))?(b?(b=!1,g=a&&c.isArray(a)?a:[]):g=a&&c.isPlainObject(a)?a:{},h[e]=c.extend(k,g,d)):d!==undefined&&(h[e]=d)));return h},c.queue=function(a,d,e){if(a){d=(d||"fx")+"queue";var f=c.data(a,d);return e?(!f||c.isArray(e)?f=c.data(a,d,function(a,c){var d=c||[];return a&&(b(Object(a))?function(a,b){for(var c=+b.length,d=0,e=a.length;d<c;)a[e++]=b[d++];if(c!==c)for(;b[d]!==undefined;)a[e++]=b[d++];a.length=e}(d,"string"==typeof a?[a]:a):[].push.call(d,a)),d}(e)):f.push(e),f):f||[]}},c.dequeue=function(a,b){c.each(a.nodeType?[a]:a,function(a,d){b=b||"fx";var e=c.queue(d,b),f=e.shift();"inprogress"===f&&(f=e.shift()),f&&("fx"===b&&e.unshift("inprogress"),f.call(d,function(){c.dequeue(d,b)}))})},c.fn=c.prototype={init:function(a){if(a.nodeType)return this[0]=a,this;throw new Error("Not a DOM node.")},offset:function(){var b=this[0].getBoundingClientRect?this[0].getBoundingClientRect():{top:0,left:0};return{top:b.top+(a.pageYOffset||document.scrollTop||0)-(document.clientTop||0),left:b.left+(a.pageXOffset||document.scrollLeft||0)-(document.clientLeft||0)}},position:function(){var a=this[0],b=function(a){for(var b=a.offsetParent;b&&"html"!==b.nodeName.toLowerCase()&&b.style&&"static"===b.style.position.toLowerCase();)b=b.offsetParent;return b||document}(a),d=this.offset(),e=/^(?:body|html)$/i.test(b.nodeName)?{top:0,left:0}:c(b).offset();return d.top-=parseFloat(a.style.marginTop)||0,d.left-=parseFloat(a.style.marginLeft)||0,b.style&&(e.top+=parseFloat(b.style.borderTopWidth)||0,e.left+=parseFloat(b.style.borderLeftWidth)||0),{top:d.top-e.top,left:d.left-e.left}}};var d={};c.expando="velocity"+(new Date).getTime(),c.uuid=0;for(var e={},f=e.hasOwnProperty,g=e.toString,h="Boolean Number String Function Array Date RegExp Object Error".split(" "),i=0;i<h.length;i++)e["[object "+h[i]+"]"]=h[i].toLowerCase();c.fn.init.prototype=c.fn,a.Velocity={Utilities:c}}}(window),function(a){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=a():"function"==typeof define&&define.amd?define(a):a()}(function(){"use strict";return function(a,b,c,d){function e(a){for(var b=-1,c=a?a.length:0,d=[];++b<c;){var e=a[b];e&&d.push(e)}return d}function f(a){return u.isWrapped(a)?a=s.call(a):u.isNode(a)&&(a=[a]),a}function g(a){var b=o.data(a,"velocity");return null===b?d:b}function h(a,b){var c=g(a);c&&c.delayTimer&&!c.delayPaused&&(c.delayRemaining=c.delay-b+c.delayBegin,c.delayPaused=!0,clearTimeout(c.delayTimer.setTimeout))}function i(a,b){var c=g(a);c&&c.delayTimer&&c.delayPaused&&(c.delayPaused=!1,c.delayTimer.setTimeout=setTimeout(c.delayTimer.next,c.delayRemaining))}function j(a){return function(b){return Math.round(b*a)*(1/a)}}function k(a,c,d,e){function f(a,b){return 1-3*b+3*a}function g(a,b){return 3*b-6*a}function h(a){return 3*a}function i(a,b,c){return((f(b,c)*a+g(b,c))*a+h(b))*a}function j(a,b,c){return 3*f(b,c)*a*a+2*g(b,c)*a+h(b)}function k(b,c){for(var e=0;e<p;++e){var f=j(c,a,d);if(0===f)return c;c-=(i(c,a,d)-b)/f}return c}function l(){for(var b=0;b<t;++b)x[b]=i(b*u,a,d)}function m(b,c,e){var f,g,h=0;do{g=c+(e-c)/2,f=i(g,a,d)-b,f>0?e=g:c=g}while(Math.abs(f)>r&&++h<s);return g}function n(b){for(var c=0,e=1,f=t-1;e!==f&&x[e]<=b;++e)c+=u;--e;var g=(b-x[e])/(x[e+1]-x[e]),h=c+g*u,i=j(h,a,d);return i>=q?k(b,h):0===i?h:m(b,c,c+u)}function o(){y=!0,a===c&&d===e||l()}var p=4,q=.001,r=1e-7,s=10,t=11,u=1/(t-1),v="Float32Array"in b;if(4!==arguments.length)return!1;for(var w=0;w<4;++w)if("number"!=typeof arguments[w]||isNaN(arguments[w])||!isFinite(arguments[w]))return!1;a=Math.min(a,1),d=Math.min(d,1),a=Math.max(a,0),d=Math.max(d,0);var x=v?new Float32Array(t):new Array(t),y=!1,z=function(b){return y||o(),a===c&&d===e?b:0===b?0:1===b?1:i(n(b),c,e)};z.getControlPoints=function(){return[{x:a,y:c},{x:d,y:e}]};var A="generateBezier("+[a,c,d,e]+")";return z.toString=function(){return A},z}function l(a,b){var c=a;return u.isString(a)?y.Easings[a]||(c=!1):c=u.isArray(a)&&1===a.length?j.apply(null,a):u.isArray(a)&&2===a.length?z.apply(null,a.concat([b])):!(!u.isArray(a)||4!==a.length)&&k.apply(null,a),!1===c&&(c=y.Easings[y.defaults.easing]?y.defaults.easing:x),c}function m(a){if(a){var b=y.timestamp&&!0!==a?a:r.now(),c=y.State.calls.length;c>1e4&&(y.State.calls=e(y.State.calls),c=y.State.calls.length);for(var f=0;f<c;f++)if(y.State.calls[f]){var h=y.State.calls[f],i=h[0],j=h[2],k=h[3],l=!k,q=null,s=h[5],t=h[6];if(k||(k=y.State.calls[f][3]=b-16),s){if(!0!==s.resume)continue;k=h[3]=Math.round(b-t-16),h[5]=null}t=h[6]=b-k;for(var v=Math.min(t/j.duration,1),w=0,x=i.length;w<x;w++){var z=i[w],B=z.element;if(g(B)){var D=!1;if(j.display!==d&&null!==j.display&&"none"!==j.display){if("flex"===j.display){var E=["-webkit-box","-moz-box","-ms-flexbox","-webkit-flex"];o.each(E,function(a,b){A.setPropertyValue(B,"display",b)})}A.setPropertyValue(B,"display",j.display)}j.visibility!==d&&"hidden"!==j.visibility&&A.setPropertyValue(B,"visibility",j.visibility);for(var F in z)if(z.hasOwnProperty(F)&&"element"!==F){var G,H=z[F],I=u.isString(H.easing)?y.Easings[H.easing]:H.easing;if(u.isString(H.pattern)){var J=1===v?function(a,b,c){var d=H.endValue[b];return c?Math.round(d):d}:function(a,b,c){var d=H.startValue[b],e=H.endValue[b]-d,f=d+e*I(v,j,e);return c?Math.round(f):f};G=H.pattern.replace(/{(\d+)(!)?}/g,J)}else if(1===v)G=H.endValue;else{var K=H.endValue-H.startValue;G=H.startValue+K*I(v,j,K)}if(!l&&G===H.currentValue)continue;if(H.currentValue=G,"tween"===F)q=G;else{var L;if(A.Hooks.registered[F]){L=A.Hooks.getRoot(F);var M=g(B).rootPropertyValueCache[L];M&&(H.rootPropertyValue=M)}var N=A.setPropertyValue(B,F,H.currentValue+(p<9&&0===parseFloat(G)?"":H.unitType),H.rootPropertyValue,H.scrollData);A.Hooks.registered[F]&&(A.Normalizations.registered[L]?g(B).rootPropertyValueCache[L]=A.Normalizations.registered[L]("extract",null,N[1]):g(B).rootPropertyValueCache[L]=N[1]),"transform"===N[0]&&(D=!0)}}j.mobileHA&&g(B).transformCache.translate3d===d&&(g(B).transformCache.translate3d="(0px, 0px, 0px)",D=!0),D&&A.flushTransformCache(B)}}j.display!==d&&"none"!==j.display&&(y.State.calls[f][2].display=!1),j.visibility!==d&&"hidden"!==j.visibility&&(y.State.calls[f][2].visibility=!1),j.progress&&j.progress.call(h[1],h[1],v,Math.max(0,k+j.duration-b),k,q),1===v&&n(f)}}y.State.isTicking&&C(m)}function n(a,b){if(!y.State.calls[a])return!1;for(var c=y.State.calls[a][0],e=y.State.calls[a][1],f=y.State.calls[a][2],h=y.State.calls[a][4],i=!1,j=0,k=c.length;j<k;j++){var l=c[j].element;b||f.loop||("none"===f.display&&A.setPropertyValue(l,"display",f.display),"hidden"===f.visibility&&A.setPropertyValue(l,"visibility",f.visibility));var m=g(l);if(!0!==f.loop&&(o.queue(l)[1]===d||!/\.velocityQueueEntryFlag/i.test(o.queue(l)[1]))&&m){m.isAnimating=!1,m.rootPropertyValueCache={};var n=!1;o.each(A.Lists.transforms3D,function(a,b){var c=/^scale/.test(b)?1:0,e=m.transformCache[b];m.transformCache[b]!==d&&new RegExp("^\\("+c+"[^.]").test(e)&&(n=!0,delete m.transformCache[b])}),f.mobileHA&&(n=!0,delete m.transformCache.translate3d),n&&A.flushTransformCache(l),A.Values.removeClass(l,"velocity-animating")}if(!b&&f.complete&&!f.loop&&j===k-1)try{f.complete.call(e,e)}catch(r){setTimeout(function(){throw r},1)}h&&!0!==f.loop&&h(e),m&&!0===f.loop&&!b&&(o.each(m.tweensContainer,function(a,b){if(/^rotate/.test(a)&&(parseFloat(b.startValue)-parseFloat(b.endValue))%360==0){var c=b.startValue;b.startValue=b.endValue,b.endValue=c}/^backgroundPosition/.test(a)&&100===parseFloat(b.endValue)&&"%"===b.unitType&&(b.endValue=0,b.startValue=100)}),y(l,"reverse",{loop:!0,delay:f.delay})),!1!==f.queue&&o.dequeue(l,f.queue)}y.State.calls[a]=!1;for(var p=0,q=y.State.calls.length;p<q;p++)if(!1!==y.State.calls[p]){i=!0;break}!1===i&&(y.State.isTicking=!1,delete y.State.calls,y.State.calls=[])}var o,p=function(){if(c.documentMode)return c.documentMode;for(var a=7;a>4;a--){var b=c.createElement("div");if(b.innerHTML="\x3c!--[if IE "+a+"]><span></span><![endif]--\x3e",b.getElementsByTagName("span").length)return b=null,a}return d}(),q=function(){var a=0;return b.webkitRequestAnimationFrame||b.mozRequestAnimationFrame||function(b){var c,d=(new Date).getTime();return c=Math.max(0,16-(d-a)),a=d+c,setTimeout(function(){b(d+c)},c)}}(),r=function(){var a=b.performance||{};if("function"!=typeof a.now){var c=a.timing&&a.timing.navigationStart?a.timing.navigationStart:(new Date).getTime();a.now=function(){return(new Date).getTime()-c}}return a}(),s=function(){var a=Array.prototype.slice;try{return a.call(c.documentElement),a}catch(b){return function(b,c){var d=this.length;if("number"!=typeof b&&(b=0),"number"!=typeof c&&(c=d),this.slice)return a.call(this,b,c);var e,f=[],g=b>=0?b:Math.max(0,d+b),h=c<0?d+c:Math.min(c,d),i=h-g;if(i>0)if(f=new Array(i),this.charAt)for(e=0;e<i;e++)f[e]=this.charAt(g+e);else for(e=0;e<i;e++)f[e]=this[g+e];return f}}}(),t=function(){return Array.prototype.includes?function(a,b){return a.includes(b)}:Array.prototype.indexOf?function(a,b){return a.indexOf(b)>=0}:function(a,b){for(var c=0;c<a.length;c++)if(a[c]===b)return!0;return!1}},u={isNumber:function(a){return"number"==typeof a},isString:function(a){return"string"==typeof a},isArray:Array.isArray||function(a){return"[object Array]"===Object.prototype.toString.call(a)},isFunction:function(a){return"[object Function]"===Object.prototype.toString.call(a)},isNode:function(a){return a&&a.nodeType},isWrapped:function(a){return a&&a!==b&&u.isNumber(a.length)&&!u.isString(a)&&!u.isFunction(a)&&!u.isNode(a)&&(0===a.length||u.isNode(a[0]))},isSVG:function(a){return b.SVGElement&&a instanceof b.SVGElement},isEmptyObject:function(a){for(var b in a)if(a.hasOwnProperty(b))return!1;return!0}},v=!1;if(a.fn&&a.fn.jquery?(o=a,v=!0):o=b.Velocity.Utilities,p<=8&&!v)throw new Error("Velocity: IE8 and below require jQuery to be loaded before Velocity.");if(p<=7)return void(jQuery.fn.velocity=jQuery.fn.animate);var w=400,x="swing",y={State:{isMobile:/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(b.navigator.userAgent),isAndroid:/Android/i.test(b.navigator.userAgent),isGingerbread:/Android 2\.3\.[3-7]/i.test(b.navigator.userAgent),isChrome:b.chrome,isFirefox:/Firefox/i.test(b.navigator.userAgent),prefixElement:c.createElement("div"),prefixMatches:{},scrollAnchor:null,scrollPropertyLeft:null,scrollPropertyTop:null,isTicking:!1,calls:[],delayedElements:{count:0}},CSS:{},Utilities:o,Redirects:{},Easings:{},Promise:b.Promise,defaults:{queue:"",duration:w,easing:x,begin:d,complete:d,progress:d,display:d,visibility:d,loop:!1,delay:!1,mobileHA:!0,_cacheValues:!0,promiseRejectEmpty:!0},init:function(a){o.data(a,"velocity",{isSVG:u.isSVG(a),isAnimating:!1,computedStyle:null,tweensContainer:null,rootPropertyValueCache:{},transformCache:{}})},hook:null,mock:!1,version:{major:1,minor:5,patch:2},debug:!1,timestamp:!0,pauseAll:function(a){var b=(new Date).getTime();o.each(y.State.calls,function(b,c){if(c){if(a!==d&&(c[2].queue!==a||!1===c[2].queue))return!0;c[5]={resume:!1}}}),o.each(y.State.delayedElements,function(a,c){c&&h(c,b)})},resumeAll:function(a){var b=(new Date).getTime();o.each(y.State.calls,function(b,c){if(c){if(a!==d&&(c[2].queue!==a||!1===c[2].queue))return!0;c[5]&&(c[5].resume=!0)}}),o.each(y.State.delayedElements,function(a,c){c&&i(c,b)})}};b.pageYOffset!==d?(y.State.scrollAnchor=b,y.State.scrollPropertyLeft="pageXOffset",y.State.scrollPropertyTop="pageYOffset"):(y.State.scrollAnchor=c.documentElement||c.body.parentNode||c.body,y.State.scrollPropertyLeft="scrollLeft",y.State.scrollPropertyTop="scrollTop");var z=function(){function a(a){return-a.tension*a.x-a.friction*a.v}function b(b,c,d){var e={x:b.x+d.dx*c,v:b.v+d.dv*c,tension:b.tension,friction:b.friction};return{dx:e.v,dv:a(e)}}function c(c,d){var e={dx:c.v,dv:a(c)},f=b(c,.5*d,e),g=b(c,.5*d,f),h=b(c,d,g),i=1/6*(e.dx+2*(f.dx+g.dx)+h.dx),j=1/6*(e.dv+2*(f.dv+g.dv)+h.dv);return c.x=c.x+i*d,c.v=c.v+j*d,c}return function d(a,b,e){var f,g,h,i={x:-1,v:0,tension:null,friction:null},j=[0],k=0;for(a=parseFloat(a)||500,b=parseFloat(b)||20,e=e||null,i.tension=a,i.friction=b,f=null!==e,f?(k=d(a,b),g=k/e*.016):g=.016;;)if(h=c(h||i,g),j.push(1+h.x),k+=16,!(Math.abs(h.x)>1e-4&&Math.abs(h.v)>1e-4))break;return f?function(a){return j[a*(j.length-1)|0]}:k}}();y.Easings={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2},spring:function(a){return 1-Math.cos(4.5*a*Math.PI)*Math.exp(6*-a)}},o.each([["ease",[.25,.1,.25,1]],["ease-in",[.42,0,1,1]],["ease-out",[0,0,.58,1]],["ease-in-out",[.42,0,.58,1]],["easeInSine",[.47,0,.745,.715]],["easeOutSine",[.39,.575,.565,1]],["easeInOutSine",[.445,.05,.55,.95]],["easeInQuad",[.55,.085,.68,.53]],["easeOutQuad",[.25,.46,.45,.94]],["easeInOutQuad",[.455,.03,.515,.955]],["easeInCubic",[.55,.055,.675,.19]],["easeOutCubic",[.215,.61,.355,1]],["easeInOutCubic",[.645,.045,.355,1]],["easeInQuart",[.895,.03,.685,.22]],["easeOutQuart",[.165,.84,.44,1]],["easeInOutQuart",[.77,0,.175,1]],["easeInQuint",[.755,.05,.855,.06]],["easeOutQuint",[.23,1,.32,1]],["easeInOutQuint",[.86,0,.07,1]],["easeInExpo",[.95,.05,.795,.035]],["easeOutExpo",[.19,1,.22,1]],["easeInOutExpo",[1,0,0,1]],["easeInCirc",[.6,.04,.98,.335]],["easeOutCirc",[.075,.82,.165,1]],["easeInOutCirc",[.785,.135,.15,.86]]],function(a,b){y.Easings[b[0]]=k.apply(null,b[1])});var A=y.CSS={RegEx:{isHex:/^#([A-f\d]{3}){1,2}$/i,valueUnwrap:/^[A-z]+\((.*)\)$/i,wrappedValueAlreadyExtracted:/[0-9.]+ [0-9.]+ [0-9.]+( [0-9.]+)?/,valueSplit:/([A-z]+\(.+\))|(([A-z0-9#-.]+?)(?=\s|$))/gi},Lists:{colors:["fill","stroke","stopColor","color","backgroundColor","borderColor","borderTopColor","borderRightColor","borderBottomColor","borderLeftColor","outlineColor"],transformsBase:["translateX","translateY","scale","scaleX","scaleY","skewX","skewY","rotateZ"],transforms3D:["transformPerspective","translateZ","scaleZ","rotateX","rotateY"],units:["%","em","ex","ch","rem","vw","vh","vmin","vmax","cm","mm","Q","in","pc","pt","px","deg","grad","rad","turn","s","ms"],colorNames:{aliceblue:"240,248,255",antiquewhite:"250,235,215",aquamarine:"127,255,212",aqua:"0,255,255",azure:"240,255,255",beige:"245,245,220",bisque:"255,228,196",black:"0,0,0",blanchedalmond:"255,235,205",blueviolet:"138,43,226",blue:"0,0,255",brown:"165,42,42",burlywood:"222,184,135",cadetblue:"95,158,160",chartreuse:"127,255,0",chocolate:"210,105,30",coral:"255,127,80",cornflowerblue:"100,149,237",cornsilk:"255,248,220",crimson:"220,20,60",cyan:"0,255,255",darkblue:"0,0,139",darkcyan:"0,139,139",darkgoldenrod:"184,134,11",darkgray:"169,169,169",darkgrey:"169,169,169",darkgreen:"0,100,0",darkkhaki:"189,183,107",darkmagenta:"139,0,139",darkolivegreen:"85,107,47",darkorange:"255,140,0",darkorchid:"153,50,204",darkred:"139,0,0",darksalmon:"233,150,122",darkseagreen:"143,188,143",darkslateblue:"72,61,139",darkslategray:"47,79,79",darkturquoise:"0,206,209",darkviolet:"148,0,211",deeppink:"255,20,147",deepskyblue:"0,191,255",dimgray:"105,105,105",dimgrey:"105,105,105",dodgerblue:"30,144,255",firebrick:"178,34,34",floralwhite:"255,250,240",forestgreen:"34,139,34",fuchsia:"255,0,255",gainsboro:"220,220,220",ghostwhite:"248,248,255",gold:"255,215,0",goldenrod:"218,165,32",gray:"128,128,128",grey:"128,128,128",greenyellow:"173,255,47",green:"0,128,0",honeydew:"240,255,240",hotpink:"255,105,180",indianred:"205,92,92",indigo:"75,0,130",ivory:"255,255,240",khaki:"240,230,140",lavenderblush:"255,240,245",lavender:"230,230,250",lawngreen:"124,252,0",lemonchiffon:"255,250,205",lightblue:"173,216,230",lightcoral:"240,128,128",lightcyan:"224,255,255",lightgoldenrodyellow:"250,250,210",lightgray:"211,211,211",lightgrey:"211,211,211",lightgreen:"144,238,144",lightpink:"255,182,193",lightsalmon:"255,160,122",lightseagreen:"32,178,170",lightskyblue:"135,206,250",lightslategray:"119,136,153",lightsteelblue:"176,196,222",lightyellow:"255,255,224",limegreen:"50,205,50",lime:"0,255,0",linen:"250,240,230",magenta:"255,0,255",maroon:"128,0,0",mediumaquamarine:"102,205,170",mediumblue:"0,0,205",mediumorchid:"186,85,211",mediumpurple:"147,112,219",mediumseagreen:"60,179,113",mediumslateblue:"123,104,238",mediumspringgreen:"0,250,154",mediumturquoise:"72,209,204",mediumvioletred:"199,21,133",midnightblue:"25,25,112",mintcream:"245,255,250",mistyrose:"255,228,225",moccasin:"255,228,181",navajowhite:"255,222,173",navy:"0,0,128",oldlace:"253,245,230",olivedrab:"107,142,35",olive:"128,128,0",orangered:"255,69,0",orange:"255,165,0",orchid:"218,112,214",palegoldenrod:"238,232,170",palegreen:"152,251,152",paleturquoise:"175,238,238",palevioletred:"219,112,147",papayawhip:"255,239,213",peachpuff:"255,218,185",peru:"205,133,63",pink:"255,192,203",plum:"221,160,221",powderblue:"176,224,230",purple:"128,0,128",red:"255,0,0",rosybrown:"188,143,143",royalblue:"65,105,225",saddlebrown:"139,69,19",salmon:"250,128,114",sandybrown:"244,164,96",seagreen:"46,139,87",seashell:"255,245,238",sienna:"160,82,45",silver:"192,192,192",skyblue:"135,206,235",slateblue:"106,90,205",slategray:"112,128,144",snow:"255,250,250",springgreen:"0,255,127",steelblue:"70,130,180",tan:"210,180,140",teal:"0,128,128",thistle:"216,191,216",tomato:"255,99,71",turquoise:"64,224,208",violet:"238,130,238",wheat:"245,222,179",whitesmoke:"245,245,245",white:"255,255,255",yellowgreen:"154,205,50",yellow:"255,255,0"}},Hooks:{templates:{textShadow:["Color X Y Blur","black 0px 0px 0px"],boxShadow:["Color X Y Blur Spread","black 0px 0px 0px 0px"],clip:["Top Right Bottom Left","0px 0px 0px 0px"],backgroundPosition:["X Y","0% 0%"],transformOrigin:["X Y Z","50% 50% 0px"],perspectiveOrigin:["X Y","50% 50%"]},registered:{},register:function(){for(var a=0;a<A.Lists.colors.length;a++){var b="color"===A.Lists.colors[a]?"0 0 0 1":"255 255 255 1";A.Hooks.templates[A.Lists.colors[a]]=["Red Green Blue Alpha",b]}var c,d,e;if(p)for(c in A.Hooks.templates)if(A.Hooks.templates.hasOwnProperty(c)){d=A.Hooks.templates[c],e=d[0].split(" ");var f=d[1].match(A.RegEx.valueSplit);"Color"===e[0]&&(e.push(e.shift()),f.push(f.shift()),A.Hooks.templates[c]=[e.join(" "),f.join(" ")])}for(c in A.Hooks.templates)if(A.Hooks.templates.hasOwnProperty(c)){d=A.Hooks.templates[c],e=d[0].split(" ");for(var g in e)if(e.hasOwnProperty(g)){var h=c+e[g],i=g;A.Hooks.registered[h]=[c,i]}}},getRoot:function(a){var b=A.Hooks.registered[a];return b?b[0]:a},getUnit:function(a,b){var c=(a.substr(b||0,5).match(/^[a-z%]+/)||[])[0]||"";return c&&t(A.Lists.units,c)?c:""},fixColors:function(a){return a.replace(/(rgba?\(\s*)?(\b[a-z]+\b)/g,function(a,b,c){return A.Lists.colorNames.hasOwnProperty(c)?(b||"rgba(")+A.Lists.colorNames[c]+(b?"":",1)"):b+c})},cleanRootPropertyValue:function(a,b){return A.RegEx.valueUnwrap.test(b)&&(b=b.match(A.RegEx.valueUnwrap)[1]),A.Values.isCSSNullValue(b)&&(b=A.Hooks.templates[a][1]),b},extractValue:function(a,b){var c=A.Hooks.registered[a];if(c){var d=c[0],e=c[1];return b=A.Hooks.cleanRootPropertyValue(d,b),b.toString().match(A.RegEx.valueSplit)[e]}return b},injectValue:function(a,b,c){var d=A.Hooks.registered[a];if(d){var e,f=d[0],g=d[1];return c=A.Hooks.cleanRootPropertyValue(f,c),e=c.toString().match(A.RegEx.valueSplit),e[g]=b,e.join(" ")}return c}},Normalizations:{registered:{clip:function(a,b,c){switch(a){case"name":return"clip";case"extract":var d;return A.RegEx.wrappedValueAlreadyExtracted.test(c)?d=c:(d=c.toString().match(A.RegEx.valueUnwrap),d=d?d[1].replace(/,(\s+)?/g," "):c),d;case"inject":return"rect("+c+")"}},blur:function(a,b,c){switch(a){case"name":return y.State.isFirefox?"filter":"-webkit-filter";case"extract":var d=parseFloat(c);if(!d&&0!==d){var e=c.toString().match(/blur\(([0-9]+[A-z]+)\)/i);d=e?e[1]:0}return d;case"inject":return parseFloat(c)?"blur("+c+")":"none"}},opacity:function(a,b,c){if(p<=8)switch(a){case"name":return"filter";case"extract":var d=c.toString().match(/alpha\(opacity=(.*)\)/i);return c=d?d[1]/100:1;case"inject":return b.style.zoom=1,parseFloat(c)>=1?"":"alpha(opacity="+parseInt(100*parseFloat(c),10)+")"}else switch(a){case"name":return"opacity";case"extract":case"inject":return c}}},register:function(){function a(a,b,c){if("border-box"===A.getPropertyValue(b,"boxSizing").toString().toLowerCase()===(c||!1)){var d,e,f=0,g="width"===a?["Left","Right"]:["Top","Bottom"],h=["padding"+g[0],"padding"+g[1],"border"+g[0]+"Width","border"+g[1]+"Width"];for(d=0;d<h.length;d++)e=parseFloat(A.getPropertyValue(b,h[d])),isNaN(e)||(f+=e);return c?-f:f}return 0}function b(b,c){return function(d,e,f){switch(d){case"name":return b;case"extract":return parseFloat(f)+a(b,e,c);case"inject":return parseFloat(f)-a(b,e,c)+"px"}}}p&&!(p>9)||y.State.isGingerbread||(A.Lists.transformsBase=A.Lists.transformsBase.concat(A.Lists.transforms3D));for(var c=0;c<A.Lists.transformsBase.length;c++)!function(){var a=A.Lists.transformsBase[c];A.Normalizations.registered[a]=function(b,c,e){switch(b){case"name":return"transform";case"extract":return g(c)===d||g(c).transformCache[a]===d?/^scale/i.test(a)?1:0:g(c).transformCache[a].replace(/[()]/g,"");case"inject":var f=!1;switch(a.substr(0,a.length-1)){case"translate":f=!/(%|px|em|rem|vw|vh|\d)$/i.test(e);break;case"scal":case"scale":y.State.isAndroid&&g(c).transformCache[a]===d&&e<1&&(e=1),f=!/(\d)$/i.test(e);break;case"skew":case"rotate":f=!/(deg|\d)$/i.test(e)}return f||(g(c).transformCache[a]="("+e+")"),g(c).transformCache[a]}}}();for(var e=0;e<A.Lists.colors.length;e++)!function(){var a=A.Lists.colors[e];A.Normalizations.registered[a]=function(b,c,e){switch(b){case"name":return a;case"extract":var f;if(A.RegEx.wrappedValueAlreadyExtracted.test(e))f=e;else{var g,h={black:"rgb(0, 0, 0)",blue:"rgb(0, 0, 255)",gray:"rgb(128, 128, 128)",green:"rgb(0, 128, 0)",red:"rgb(255, 0, 0)",white:"rgb(255, 255, 255)"};/^[A-z]+$/i.test(e)?g=h[e]!==d?h[e]:h.black:A.RegEx.isHex.test(e)?g="rgb("+A.Values.hexToRgb(e).join(" ")+")":/^rgba?\(/i.test(e)||(g=h.black),f=(g||e).toString().match(A.RegEx.valueUnwrap)[1].replace(/,(\s+)?/g," ")}return(!p||p>8)&&3===f.split(" ").length&&(f+=" 1"),f;case"inject":return/^rgb/.test(e)?e:(p<=8?4===e.split(" ").length&&(e=e.split(/\s+/).slice(0,3).join(" ")):3===e.split(" ").length&&(e+=" 1"),(p<=8?"rgb":"rgba")+"("+e.replace(/\s+/g,",").replace(/\.(\d)+(?=,)/g,"")+")")}}}();A.Normalizations.registered.innerWidth=b("width",!0),A.Normalizations.registered.innerHeight=b("height",!0),A.Normalizations.registered.outerWidth=b("width"),A.Normalizations.registered.outerHeight=b("height")}},Names:{camelCase:function(a){return a.replace(/-(\w)/g,function(a,b){return b.toUpperCase()})},SVGAttribute:function(a){var b="width|height|x|y|cx|cy|r|rx|ry|x1|x2|y1|y2";return(p||y.State.isAndroid&&!y.State.isChrome)&&(b+="|transform"),new RegExp("^("+b+")$","i").test(a)},prefixCheck:function(a){if(y.State.prefixMatches[a])return[y.State.prefixMatches[a],!0];for(var b=["","Webkit","Moz","ms","O"],c=0,d=b.length;c<d;c++){var e;if(e=0===c?a:b[c]+a.replace(/^\w/,function(a){return a.toUpperCase()}),u.isString(y.State.prefixElement.style[e]))return y.State.prefixMatches[a]=e,[e,!0]}return[a,!1]}},Values:{hexToRgb:function(a){var b,c=/^#?([a-f\d])([a-f\d])([a-f\d])$/i,d=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i;return a=a.replace(c,function(a,b,c,d){return b+b+c+c+d+d}),b=d.exec(a),b?[parseInt(b[1],16),parseInt(b[2],16),parseInt(b[3],16)]:[0,0,0]},isCSSNullValue:function(a){return!a||/^(none|auto|transparent|(rgba\(0, ?0, ?0, ?0\)))$/i.test(a)},getUnitType:function(a){return/^(rotate|skew)/i.test(a)?"deg":/(^(scale|scaleX|scaleY|scaleZ|alpha|flexGrow|flexHeight|zIndex|fontWeight)$)|((opacity|red|green|blue|alpha)$)/i.test(a)?"":"px"},getDisplayType:function(a){var b=a&&a.tagName.toString().toLowerCase();return/^(b|big|i|small|tt|abbr|acronym|cite|code|dfn|em|kbd|strong|samp|var|a|bdo|br|img|map|object|q|script|span|sub|sup|button|input|label|select|textarea)$/i.test(b)?"inline":/^(li)$/i.test(b)?"list-item":/^(tr)$/i.test(b)?"table-row":/^(table)$/i.test(b)?"table":/^(tbody)$/i.test(b)?"table-row-group":"block"},addClass:function(a,b){if(a)if(a.classList)a.classList.add(b);else if(u.isString(a.className))a.className+=(a.className.length?" ":"")+b;else{var c=a.getAttribute(p<=7?"className":"class")||"";a.setAttribute("class",c+(c?" ":"")+b)}},removeClass:function(a,b){if(a)if(a.classList)a.classList.remove(b);else if(u.isString(a.className))a.className=a.className.toString().replace(new RegExp("(^|\\s)"+b.split(" ").join("|")+"(\\s|$)","gi")," ");else{var c=a.getAttribute(p<=7?"className":"class")||"";a.setAttribute("class",c.replace(new RegExp("(^|s)"+b.split(" ").join("|")+"(s|$)","gi")," "))}}},getPropertyValue:function(a,c,e,f){function h(a,c){var e=0;if(p<=8)e=o.css(a,c);else{var i=!1;/^(width|height)$/.test(c)&&0===A.getPropertyValue(a,"display")&&(i=!0,A.setPropertyValue(a,"display",A.Values.getDisplayType(a)));var j=function(){i&&A.setPropertyValue(a,"display","none")};if(!f){if("height"===c&&"border-box"!==A.getPropertyValue(a,"boxSizing").toString().toLowerCase()){var k=a.offsetHeight-(parseFloat(A.getPropertyValue(a,"borderTopWidth"))||0)-(parseFloat(A.getPropertyValue(a,"borderBottomWidth"))||0)-(parseFloat(A.getPropertyValue(a,"paddingTop"))||0)-(parseFloat(A.getPropertyValue(a,"paddingBottom"))||0);return j(),k}if("width"===c&&"border-box"!==A.getPropertyValue(a,"boxSizing").toString().toLowerCase()){var l=a.offsetWidth-(parseFloat(A.getPropertyValue(a,"borderLeftWidth"))||0)-(parseFloat(A.getPropertyValue(a,"borderRightWidth"))||0)-(parseFloat(A.getPropertyValue(a,"paddingLeft"))||0)-(parseFloat(A.getPropertyValue(a,"paddingRight"))||0);return j(),l}}var m;m=g(a)===d?b.getComputedStyle(a,null):g(a).computedStyle?g(a).computedStyle:g(a).computedStyle=b.getComputedStyle(a,null),"borderColor"===c&&(c="borderTopColor"),e=9===p&&"filter"===c?m.getPropertyValue(c):m[c],""!==e&&null!==e||(e=a.style[c]),j()}if("auto"===e&&/^(top|right|bottom|left)$/i.test(c)){var n=h(a,"position");("fixed"===n||"absolute"===n&&/top|left/i.test(c))&&(e=o(a).position()[c]+"px")}return e}var i;if(A.Hooks.registered[c]){var j=c,k=A.Hooks.getRoot(j);e===d&&(e=A.getPropertyValue(a,A.Names.prefixCheck(k)[0])),A.Normalizations.registered[k]&&(e=A.Normalizations.registered[k]("extract",a,e)),i=A.Hooks.extractValue(j,e)}else if(A.Normalizations.registered[c]){var l,m;l=A.Normalizations.registered[c]("name",a),"transform"!==l&&(m=h(a,A.Names.prefixCheck(l)[0]),A.Values.isCSSNullValue(m)&&A.Hooks.templates[c]&&(m=A.Hooks.templates[c][1])),i=A.Normalizations.registered[c]("extract",a,m)}if(!/^[\d-]/.test(i)){var n=g(a);if(n&&n.isSVG&&A.Names.SVGAttribute(c))if(/^(height|width)$/i.test(c))try{i=a.getBBox()[c]}catch(q){i=0}else i=a.getAttribute(c);else i=h(a,A.Names.prefixCheck(c)[0])}return A.Values.isCSSNullValue(i)&&(i=0),y.debug>=2&&console.log("Get "+c+": "+i),i},setPropertyValue:function(a,c,d,e,f){var h=c;if("scroll"===c)f.container?f.container["scroll"+f.direction]=d:"Left"===f.direction?b.scrollTo(d,f.alternateValue):b.scrollTo(f.alternateValue,d);else if(A.Normalizations.registered[c]&&"transform"===A.Normalizations.registered[c]("name",a))A.Normalizations.registered[c]("inject",a,d),h="transform",d=g(a).transformCache[c];else{if(A.Hooks.registered[c]){var i=c,j=A.Hooks.getRoot(c);e=e||A.getPropertyValue(a,j),d=A.Hooks.injectValue(i,d,e),c=j}if(A.Normalizations.registered[c]&&(d=A.Normalizations.registered[c]("inject",a,d),c=A.Normalizations.registered[c]("name",a)),h=A.Names.prefixCheck(c)[0],p<=8)try{a.style[h]=d}catch(l){y.debug&&console.log("Browser does not support ["+d+"] for ["+h+"]")}else{var k=g(a);k&&k.isSVG&&A.Names.SVGAttribute(c)?a.setAttribute(c,d):a.style[h]=d}y.debug>=2&&console.log("Set "+c+" ("+h+"): "+d)}return[h,d]},flushTransformCache:function(a){var b="",c=g(a);if((p||y.State.isAndroid&&!y.State.isChrome)&&c&&c.isSVG){var d=function(b){return parseFloat(A.getPropertyValue(a,b))},e={translate:[d("translateX"),d("translateY")],skewX:[d("skewX")],skewY:[d("skewY")],scale:1!==d("scale")?[d("scale"),d("scale")]:[d("scaleX"),d("scaleY")],rotate:[d("rotateZ"),0,0]};o.each(g(a).transformCache,function(a){/^translate/i.test(a)?a="translate":/^scale/i.test(a)?a="scale":/^rotate/i.test(a)&&(a="rotate"),e[a]&&(b+=a+"("+e[a].join(" ")+") ",delete e[a])})}else{var f,h;o.each(g(a).transformCache,function(c){if(f=g(a).transformCache[c],"transformPerspective"===c)return h=f,!0;9===p&&"rotateZ"===c&&(c="rotate"),b+=c+f+" "}),h&&(b="perspective"+h+" "+b)}A.setPropertyValue(a,"transform",b)}};A.Hooks.register(),A.Normalizations.register(),y.hook=function(a,b,c){var e;return a=f(a),o.each(a,function(a,f){if(g(f)===d&&y.init(f),c===d)e===d&&(e=A.getPropertyValue(f,b));else{var h=A.setPropertyValue(f,b,c);"transform"===h[0]&&y.CSS.flushTransformCache(f),e=h}}),e};var B=function(){function a(){return k?z.promise||null:p}function e(a,e){function f(f){var k,n;if(i.begin&&0===D)try{i.begin.call(r,r)}catch(V){setTimeout(function(){throw V},1)}if("scroll"===G){var p,q,w,x=/^x$/i.test(i.axis)?"Left":"Top",B=parseFloat(i.offset)||0;i.container?u.isWrapped(i.container)||u.isNode(i.container)?(i.container=i.container[0]||i.container,p=i.container["scroll"+x],w=p+o(a).position()[x.toLowerCase()]+B):i.container=null:(p=y.State.scrollAnchor[y.State["scrollProperty"+x]],q=y.State.scrollAnchor[y.State["scrollProperty"+("Left"===x?"Top":"Left")]],w=o(a).offset()[x.toLowerCase()]+B),j={scroll:{rootPropertyValue:!1,startValue:p,currentValue:p,endValue:w,unitType:"",easing:i.easing,scrollData:{container:i.container,direction:x,alternateValue:q}},element:a},y.debug&&console.log("tweensContainer (scroll): ",j.scroll,a)}else if("reverse"===G){if(!(k=g(a)))return;if(!k.tweensContainer)return void o.dequeue(a,i.queue);"none"===k.opts.display&&(k.opts.display="auto"),"hidden"===k.opts.visibility&&(k.opts.visibility="visible"),k.opts.loop=!1,k.opts.begin=null,k.opts.complete=null,v.easing||delete i.easing,v.duration||delete i.duration,i=o.extend({},k.opts,i),n=o.extend(!0,{},k?k.tweensContainer:null);for(var E in n)if(n.hasOwnProperty(E)&&"element"!==E){var F=n[E].startValue;n[E].startValue=n[E].currentValue=n[E].endValue,n[E].endValue=F,u.isEmptyObject(v)||(n[E].easing=i.easing),y.debug&&console.log("reverse tweensContainer ("+E+"): "+JSON.stringify(n[E]),a)}j=n}else if("start"===G){k=g(a),k&&k.tweensContainer&&!0===k.isAnimating&&(n=k.tweensContainer);var H=function(e,f){var g,l=A.Hooks.getRoot(e),m=!1,p=f[0],q=f[1],r=f[2]
        ;if(!(k&&k.isSVG||"tween"===l||!1!==A.Names.prefixCheck(l)[1]||A.Normalizations.registered[l]!==d))return void(y.debug&&console.log("Skipping ["+l+"] due to a lack of browser support."));(i.display!==d&&null!==i.display&&"none"!==i.display||i.visibility!==d&&"hidden"!==i.visibility)&&/opacity|filter/.test(e)&&!r&&0!==p&&(r=0),i._cacheValues&&n&&n[e]?(r===d&&(r=n[e].endValue+n[e].unitType),m=k.rootPropertyValueCache[l]):A.Hooks.registered[e]?r===d?(m=A.getPropertyValue(a,l),r=A.getPropertyValue(a,e,m)):m=A.Hooks.templates[l][1]:r===d&&(r=A.getPropertyValue(a,e));var s,t,v,w=!1,x=function(a,b){var c,d;return d=(b||"0").toString().toLowerCase().replace(/[%A-z]+$/,function(a){return c=a,""}),c||(c=A.Values.getUnitType(a)),[d,c]};if(r!==p&&u.isString(r)&&u.isString(p)){g="";var z=0,B=0,C=[],D=[],E=0,F=0,G=0;for(r=A.Hooks.fixColors(r),p=A.Hooks.fixColors(p);z<r.length&&B<p.length;){var H=r[z],I=p[B];if(/[\d\.-]/.test(H)&&/[\d\.-]/.test(I)){for(var J=H,K=I,L=".",N=".";++z<r.length;){if((H=r[z])===L)L="..";else if(!/\d/.test(H))break;J+=H}for(;++B<p.length;){if((I=p[B])===N)N="..";else if(!/\d/.test(I))break;K+=I}var O=A.Hooks.getUnit(r,z),P=A.Hooks.getUnit(p,B);if(z+=O.length,B+=P.length,O===P)J===K?g+=J+O:(g+="{"+C.length+(F?"!":"")+"}"+O,C.push(parseFloat(J)),D.push(parseFloat(K)));else{var Q=parseFloat(J),R=parseFloat(K);g+=(E<5?"calc":"")+"("+(Q?"{"+C.length+(F?"!":"")+"}":"0")+O+" + "+(R?"{"+(C.length+(Q?1:0))+(F?"!":"")+"}":"0")+P+")",Q&&(C.push(Q),D.push(0)),R&&(C.push(0),D.push(R))}}else{if(H!==I){E=0;break}g+=H,z++,B++,0===E&&"c"===H||1===E&&"a"===H||2===E&&"l"===H||3===E&&"c"===H||E>=4&&"("===H?E++:(E&&E<5||E>=4&&")"===H&&--E<5)&&(E=0),0===F&&"r"===H||1===F&&"g"===H||2===F&&"b"===H||3===F&&"a"===H||F>=3&&"("===H?(3===F&&"a"===H&&(G=1),F++):G&&","===H?++G>3&&(F=G=0):(G&&F<(G?5:4)||F>=(G?4:3)&&")"===H&&--F<(G?5:4))&&(F=G=0)}}z===r.length&&B===p.length||(y.debug&&console.error('Trying to pattern match mis-matched strings ["'+p+'", "'+r+'"]'),g=d),g&&(C.length?(y.debug&&console.log('Pattern found "'+g+'" -> ',C,D,"["+r+","+p+"]"),r=C,p=D,t=v=""):g=d)}g||(s=x(e,r),r=s[0],v=s[1],s=x(e,p),p=s[0].replace(/^([+-\/*])=/,function(a,b){return w=b,""}),t=s[1],r=parseFloat(r)||0,p=parseFloat(p)||0,"%"===t&&(/^(fontSize|lineHeight)$/.test(e)?(p/=100,t="em"):/^scale/.test(e)?(p/=100,t=""):/(Red|Green|Blue)$/i.test(e)&&(p=p/100*255,t="")));if(/[\/*]/.test(w))t=v;else if(v!==t&&0!==r)if(0===p)t=v;else{h=h||function(){var d={myParent:a.parentNode||c.body,position:A.getPropertyValue(a,"position"),fontSize:A.getPropertyValue(a,"fontSize")},e=d.position===M.lastPosition&&d.myParent===M.lastParent,f=d.fontSize===M.lastFontSize;M.lastParent=d.myParent,M.lastPosition=d.position,M.lastFontSize=d.fontSize;var g={};if(f&&e)g.emToPx=M.lastEmToPx,g.percentToPxWidth=M.lastPercentToPxWidth,g.percentToPxHeight=M.lastPercentToPxHeight;else{var h=k&&k.isSVG?c.createElementNS("http://www.w3.org/2000/svg","rect"):c.createElement("div");y.init(h),d.myParent.appendChild(h),o.each(["overflow","overflowX","overflowY"],function(a,b){y.CSS.setPropertyValue(h,b,"hidden")}),y.CSS.setPropertyValue(h,"position",d.position),y.CSS.setPropertyValue(h,"fontSize",d.fontSize),y.CSS.setPropertyValue(h,"boxSizing","content-box"),o.each(["minWidth","maxWidth","width","minHeight","maxHeight","height"],function(a,b){y.CSS.setPropertyValue(h,b,"100%")}),y.CSS.setPropertyValue(h,"paddingLeft","100em"),g.percentToPxWidth=M.lastPercentToPxWidth=(parseFloat(A.getPropertyValue(h,"width",null,!0))||1)/100,g.percentToPxHeight=M.lastPercentToPxHeight=(parseFloat(A.getPropertyValue(h,"height",null,!0))||1)/100,g.emToPx=M.lastEmToPx=(parseFloat(A.getPropertyValue(h,"paddingLeft"))||1)/100,d.myParent.removeChild(h)}return null===M.remToPx&&(M.remToPx=parseFloat(A.getPropertyValue(c.body,"fontSize"))||16),null===M.vwToPx&&(M.vwToPx=parseFloat(b.innerWidth)/100,M.vhToPx=parseFloat(b.innerHeight)/100),g.remToPx=M.remToPx,g.vwToPx=M.vwToPx,g.vhToPx=M.vhToPx,y.debug>=1&&console.log("Unit ratios: "+JSON.stringify(g),a),g}();var S=/margin|padding|left|right|width|text|word|letter/i.test(e)||/X$/.test(e)||"x"===e?"x":"y";switch(v){case"%":r*="x"===S?h.percentToPxWidth:h.percentToPxHeight;break;case"px":break;default:r*=h[v+"ToPx"]}switch(t){case"%":r*=1/("x"===S?h.percentToPxWidth:h.percentToPxHeight);break;case"px":break;default:r*=1/h[t+"ToPx"]}}switch(w){case"+":p=r+p;break;case"-":p=r-p;break;case"*":p*=r;break;case"/":p=r/p}j[e]={rootPropertyValue:m,startValue:r,currentValue:r,endValue:p,unitType:t,easing:q},g&&(j[e].pattern=g),y.debug&&console.log("tweensContainer ("+e+"): "+JSON.stringify(j[e]),a)};for(var I in s)if(s.hasOwnProperty(I)){var J=A.Names.camelCase(I),K=function(b,c){var d,f,g;return u.isFunction(b)&&(b=b.call(a,e,C)),u.isArray(b)?(d=b[0],!u.isArray(b[1])&&/^[\d-]/.test(b[1])||u.isFunction(b[1])||A.RegEx.isHex.test(b[1])?g=b[1]:u.isString(b[1])&&!A.RegEx.isHex.test(b[1])&&y.Easings[b[1]]||u.isArray(b[1])?(f=c?b[1]:l(b[1],i.duration),g=b[2]):g=b[1]||b[2]):d=b,c||(f=f||i.easing),u.isFunction(d)&&(d=d.call(a,e,C)),u.isFunction(g)&&(g=g.call(a,e,C)),[d||0,f,g]}(s[I]);if(t(A.Lists.colors,J)){var L=K[0],O=K[1],P=K[2];if(A.RegEx.isHex.test(L)){for(var Q=["Red","Green","Blue"],R=A.Values.hexToRgb(L),S=P?A.Values.hexToRgb(P):d,T=0;T<Q.length;T++){var U=[R[T]];O&&U.push(O),S!==d&&U.push(S[T]),H(J+Q[T],U)}continue}}H(J,K)}j.element=a}j.element&&(A.Values.addClass(a,"velocity-animating"),N.push(j),k=g(a),k&&(""===i.queue&&(k.tweensContainer=j,k.opts=i),k.isAnimating=!0),D===C-1?(y.State.calls.push([N,r,i,null,z.resolver,null,0]),!1===y.State.isTicking&&(y.State.isTicking=!0,m())):D++)}var h,i=o.extend({},y.defaults,v),j={};switch(g(a)===d&&y.init(a),parseFloat(i.delay)&&!1!==i.queue&&o.queue(a,i.queue,function(b,c){if(!0===c)return!0;y.velocityQueueEntryFlag=!0;var d=y.State.delayedElements.count++;y.State.delayedElements[d]=a;var e=function(a){return function(){y.State.delayedElements[a]=!1,b()}}(d);g(a).delayBegin=(new Date).getTime(),g(a).delay=parseFloat(i.delay),g(a).delayTimer={setTimeout:setTimeout(b,parseFloat(i.delay)),next:e}}),i.duration.toString().toLowerCase()){case"fast":i.duration=200;break;case"normal":i.duration=w;break;case"slow":i.duration=600;break;default:i.duration=parseFloat(i.duration)||1}if(!1!==y.mock&&(!0===y.mock?i.duration=i.delay=1:(i.duration*=parseFloat(y.mock)||1,i.delay*=parseFloat(y.mock)||1)),i.easing=l(i.easing,i.duration),i.begin&&!u.isFunction(i.begin)&&(i.begin=null),i.progress&&!u.isFunction(i.progress)&&(i.progress=null),i.complete&&!u.isFunction(i.complete)&&(i.complete=null),i.display!==d&&null!==i.display&&(i.display=i.display.toString().toLowerCase(),"auto"===i.display&&(i.display=y.CSS.Values.getDisplayType(a))),i.visibility!==d&&null!==i.visibility&&(i.visibility=i.visibility.toString().toLowerCase()),i.mobileHA=i.mobileHA&&y.State.isMobile&&!y.State.isGingerbread,!1===i.queue)if(i.delay){var k=y.State.delayedElements.count++;y.State.delayedElements[k]=a;var n=function(a){return function(){y.State.delayedElements[a]=!1,f()}}(k);g(a).delayBegin=(new Date).getTime(),g(a).delay=parseFloat(i.delay),g(a).delayTimer={setTimeout:setTimeout(f,parseFloat(i.delay)),next:n}}else f();else o.queue(a,i.queue,function(a,b){if(!0===b)return z.promise&&z.resolver(r),!0;y.velocityQueueEntryFlag=!0,f(a)});""!==i.queue&&"fx"!==i.queue||"inprogress"===o.queue(a)[0]||o.dequeue(a)}var j,k,p,q,r,s,v,x=arguments[0]&&(arguments[0].p||o.isPlainObject(arguments[0].properties)&&!arguments[0].properties.names||u.isString(arguments[0].properties));u.isWrapped(this)?(k=!1,q=0,r=this,p=this):(k=!0,q=1,r=x?arguments[0].elements||arguments[0].e:arguments[0]);var z={promise:null,resolver:null,rejecter:null};if(k&&y.Promise&&(z.promise=new y.Promise(function(a,b){z.resolver=a,z.rejecter=b})),x?(s=arguments[0].properties||arguments[0].p,v=arguments[0].options||arguments[0].o):(s=arguments[q],v=arguments[q+1]),!(r=f(r)))return void(z.promise&&(s&&v&&!1===v.promiseRejectEmpty?z.resolver():z.rejecter()));var C=r.length,D=0;if(!/^(stop|finish|finishAll|pause|resume)$/i.test(s)&&!o.isPlainObject(v)){var E=q+1;v={};for(var F=E;F<arguments.length;F++)u.isArray(arguments[F])||!/^(fast|normal|slow)$/i.test(arguments[F])&&!/^\d/.test(arguments[F])?u.isString(arguments[F])||u.isArray(arguments[F])?v.easing=arguments[F]:u.isFunction(arguments[F])&&(v.complete=arguments[F]):v.duration=arguments[F]}var G;switch(s){case"scroll":G="scroll";break;case"reverse":G="reverse";break;case"pause":var H=(new Date).getTime();return o.each(r,function(a,b){h(b,H)}),o.each(y.State.calls,function(a,b){var c=!1;b&&o.each(b[1],function(a,e){var f=v===d?"":v;return!0!==f&&b[2].queue!==f&&(v!==d||!1!==b[2].queue)||(o.each(r,function(a,d){if(d===e)return b[5]={resume:!1},c=!0,!1}),!c&&void 0)})}),a();case"resume":return o.each(r,function(a,b){i(b,H)}),o.each(y.State.calls,function(a,b){var c=!1;b&&o.each(b[1],function(a,e){var f=v===d?"":v;return!0!==f&&b[2].queue!==f&&(v!==d||!1!==b[2].queue)||(!b[5]||(o.each(r,function(a,d){if(d===e)return b[5].resume=!0,c=!0,!1}),!c&&void 0))})}),a();case"finish":case"finishAll":case"stop":o.each(r,function(a,b){g(b)&&g(b).delayTimer&&(clearTimeout(g(b).delayTimer.setTimeout),g(b).delayTimer.next&&g(b).delayTimer.next(),delete g(b).delayTimer),"finishAll"!==s||!0!==v&&!u.isString(v)||(o.each(o.queue(b,u.isString(v)?v:""),function(a,b){u.isFunction(b)&&b()}),o.queue(b,u.isString(v)?v:"",[]))});var I=[];return o.each(y.State.calls,function(a,b){b&&o.each(b[1],function(c,e){var f=v===d?"":v;if(!0!==f&&b[2].queue!==f&&(v!==d||!1!==b[2].queue))return!0;o.each(r,function(c,d){if(d===e)if((!0===v||u.isString(v))&&(o.each(o.queue(d,u.isString(v)?v:""),function(a,b){u.isFunction(b)&&b(null,!0)}),o.queue(d,u.isString(v)?v:"",[])),"stop"===s){var h=g(d);h&&h.tweensContainer&&(!0===f||""===f)&&o.each(h.tweensContainer,function(a,b){b.endValue=b.currentValue}),I.push(a)}else"finish"!==s&&"finishAll"!==s||(b[2].duration=1)})})}),"stop"===s&&(o.each(I,function(a,b){n(b,!0)}),z.promise&&z.resolver(r)),a();default:if(!o.isPlainObject(s)||u.isEmptyObject(s)){if(u.isString(s)&&y.Redirects[s]){j=o.extend({},v);var J=j.duration,K=j.delay||0;return!0===j.backwards&&(r=o.extend(!0,[],r).reverse()),o.each(r,function(a,b){parseFloat(j.stagger)?j.delay=K+parseFloat(j.stagger)*a:u.isFunction(j.stagger)&&(j.delay=K+j.stagger.call(b,a,C)),j.drag&&(j.duration=parseFloat(J)||(/^(callout|transition)/.test(s)?1e3:w),j.duration=Math.max(j.duration*(j.backwards?1-a/C:(a+1)/C),.75*j.duration,200)),y.Redirects[s].call(b,b,j||{},a,C,r,z.promise?z:d)}),a()}var L="Velocity: First argument ("+s+") was not a property map, a known action, or a registered redirect. Aborting.";return z.promise?z.rejecter(new Error(L)):b.console&&console.log(L),a()}G="start"}var M={lastParent:null,lastPosition:null,lastFontSize:null,lastPercentToPxWidth:null,lastPercentToPxHeight:null,lastEmToPx:null,remToPx:null,vwToPx:null,vhToPx:null},N=[];o.each(r,function(a,b){u.isNode(b)&&e(b,a)}),j=o.extend({},y.defaults,v),j.loop=parseInt(j.loop,10);var O=2*j.loop-1;if(j.loop)for(var P=0;P<O;P++){var Q={delay:j.delay,progress:j.progress};P===O-1&&(Q.display=j.display,Q.visibility=j.visibility,Q.complete=j.complete),B(r,"reverse",Q)}return a()};y=o.extend(B,y),y.animate=B;var C=b.requestAnimationFrame||q;if(!y.State.isMobile&&c.hidden!==d){var D=function(){c.hidden?(C=function(a){return setTimeout(function(){a(!0)},16)},m()):C=b.requestAnimationFrame||q};D(),c.addEventListener("visibilitychange",D)}return a.Velocity=y,a!==b&&(a.fn.velocity=B,a.fn.velocity.defaults=y.defaults),o.each(["Down","Up"],function(a,b){y.Redirects["slide"+b]=function(a,c,e,f,g,h){var i=o.extend({},c),j=i.begin,k=i.complete,l={},m={height:"",marginTop:"",marginBottom:"",paddingTop:"",paddingBottom:""};i.display===d&&(i.display="Down"===b?"inline"===y.CSS.Values.getDisplayType(a)?"inline-block":"block":"none"),i.begin=function(){0===e&&j&&j.call(g,g);for(var c in m)if(m.hasOwnProperty(c)){l[c]=a.style[c];var d=A.getPropertyValue(a,c);m[c]="Down"===b?[d,0]:[0,d]}l.overflow=a.style.overflow,a.style.overflow="hidden"},i.complete=function(){for(var b in l)l.hasOwnProperty(b)&&(a.style[b]=l[b]);e===f-1&&(k&&k.call(g,g),h&&h.resolver(g))},y(a,m,i)}}),o.each(["In","Out"],function(a,b){y.Redirects["fade"+b]=function(a,c,e,f,g,h){var i=o.extend({},c),j=i.complete,k={opacity:"In"===b?1:0};0!==e&&(i.begin=null),i.complete=e!==f-1?null:function(){j&&j.call(g,g),h&&h.resolver(g)},i.display===d&&(i.display="In"===b?"auto":"none"),y(this,k,i)}}),y}(window.jQuery||window.Zepto||window,window,window?window.document:undefined)});
</script>
<script type="text/javascript">
    /*! clipboard.js v2.0.6 https://clipboardjs.com/ Licensed MIT © Zeno Rocha */
    !function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClipboardJS=e():t.ClipboardJS=e()}(this,function(){return o={},r.m=n=[function(t,e){t.exports=function(t){var e;if("SELECT"===t.nodeName)t.focus(),e=t.value;else if("INPUT"===t.nodeName||"TEXTAREA"===t.nodeName){var n=t.hasAttribute("readonly");n||t.setAttribute("readonly",""),t.select(),t.setSelectionRange(0,t.value.length),n||t.removeAttribute("readonly"),e=t.value}else{t.hasAttribute("contenteditable")&&t.focus();var o=window.getSelection(),r=document.createRange();r.selectNodeContents(t),o.removeAllRanges(),o.addRange(r),e=o.toString()}return e}},function(t,e){function n(){}n.prototype={on:function(t,e,n){var o=this.e||(this.e={});return(o[t]||(o[t]=[])).push({fn:e,ctx:n}),this},once:function(t,e,n){var o=this;function r(){o.off(t,r),e.apply(n,arguments)}return r._=e,this.on(t,r,n)},emit:function(t){for(var e=[].slice.call(arguments,1),n=((this.e||(this.e={}))[t]||[]).slice(),o=0,r=n.length;o<r;o++)n[o].fn.apply(n[o].ctx,e);return this},off:function(t,e){var n=this.e||(this.e={}),o=n[t],r=[];if(o&&e)for(var i=0,a=o.length;i<a;i++)o[i].fn!==e&&o[i].fn._!==e&&r.push(o[i]);return r.length?n[t]=r:delete n[t],this}},t.exports=n,t.exports.TinyEmitter=n},function(t,e,n){var d=n(3),h=n(4);t.exports=function(t,e,n){if(!t&&!e&&!n)throw new Error("Missing required arguments");if(!d.string(e))throw new TypeError("Second argument must be a String");if(!d.fn(n))throw new TypeError("Third argument must be a Function");if(d.node(t))return s=e,f=n,(u=t).addEventListener(s,f),{destroy:function(){u.removeEventListener(s,f)}};if(d.nodeList(t))return a=t,c=e,l=n,Array.prototype.forEach.call(a,function(t){t.addEventListener(c,l)}),{destroy:function(){Array.prototype.forEach.call(a,function(t){t.removeEventListener(c,l)})}};if(d.string(t))return o=t,r=e,i=n,h(document.body,o,r,i);throw new TypeError("First argument must be a String, HTMLElement, HTMLCollection, or NodeList");var o,r,i,a,c,l,u,s,f}},function(t,n){n.node=function(t){return void 0!==t&&t instanceof HTMLElement&&1===t.nodeType},n.nodeList=function(t){var e=Object.prototype.toString.call(t);return void 0!==t&&("[object NodeList]"===e||"[object HTMLCollection]"===e)&&"length"in t&&(0===t.length||n.node(t[0]))},n.string=function(t){return"string"==typeof t||t instanceof String},n.fn=function(t){return"[object Function]"===Object.prototype.toString.call(t)}},function(t,e,n){var a=n(5);function i(t,e,n,o,r){var i=function(e,n,t,o){return function(t){t.delegateTarget=a(t.target,n),t.delegateTarget&&o.call(e,t)}}.apply(this,arguments);return t.addEventListener(n,i,r),{destroy:function(){t.removeEventListener(n,i,r)}}}t.exports=function(t,e,n,o,r){return"function"==typeof t.addEventListener?i.apply(null,arguments):"function"==typeof n?i.bind(null,document).apply(null,arguments):("string"==typeof t&&(t=document.querySelectorAll(t)),Array.prototype.map.call(t,function(t){return i(t,e,n,o,r)}))}},function(t,e){if("undefined"!=typeof Element&&!Element.prototype.matches){var n=Element.prototype;n.matches=n.matchesSelector||n.mozMatchesSelector||n.msMatchesSelector||n.oMatchesSelector||n.webkitMatchesSelector}t.exports=function(t,e){for(;t&&9!==t.nodeType;){if("function"==typeof t.matches&&t.matches(e))return t;t=t.parentNode}}},function(t,e,n){"use strict";n.r(e);var o=n(0),r=n.n(o),i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t};function a(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}function c(t){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,c),this.resolveOptions(t),this.initSelection()}var l=(function(t,e,n){return e&&a(t.prototype,e),n&&a(t,n),t}(c,[{key:"resolveOptions",value:function(t){var e=0<arguments.length&&void 0!==t?t:{};this.action=e.action,this.container=e.container,this.emitter=e.emitter,this.target=e.target,this.text=e.text,this.trigger=e.trigger,this.selectedText=""}},{key:"initSelection",value:function(){this.text?this.selectFake():this.target&&this.selectTarget()}},{key:"selectFake",value:function(){var t=this,e="rtl"==document.documentElement.getAttribute("dir");this.removeFake(),this.fakeHandlerCallback=function(){return t.removeFake()},this.fakeHandler=this.container.addEventListener("click",this.fakeHandlerCallback)||!0,this.fakeElem=document.createElement("textarea"),this.fakeElem.style.fontSize="12pt",this.fakeElem.style.border="0",this.fakeElem.style.padding="0",this.fakeElem.style.margin="0",this.fakeElem.style.position="absolute",this.fakeElem.style[e?"right":"left"]="-9999px";var n=window.pageYOffset||document.documentElement.scrollTop;this.fakeElem.style.top=n+"px",this.fakeElem.setAttribute("readonly",""),this.fakeElem.value=this.text,this.container.appendChild(this.fakeElem),this.selectedText=r()(this.fakeElem),this.copyText()}},{key:"removeFake",value:function(){this.fakeHandler&&(this.container.removeEventListener("click",this.fakeHandlerCallback),this.fakeHandler=null,this.fakeHandlerCallback=null),this.fakeElem&&(this.container.removeChild(this.fakeElem),this.fakeElem=null)}},{key:"selectTarget",value:function(){this.selectedText=r()(this.target),this.copyText()}},{key:"copyText",value:function(){var e=void 0;try{e=document.execCommand(this.action)}catch(t){e=!1}this.handleResult(e)}},{key:"handleResult",value:function(t){this.emitter.emit(t?"success":"error",{action:this.action,text:this.selectedText,trigger:this.trigger,clearSelection:this.clearSelection.bind(this)})}},{key:"clearSelection",value:function(){this.trigger&&this.trigger.focus(),document.activeElement.blur(),window.getSelection().removeAllRanges()}},{key:"destroy",value:function(){this.removeFake()}},{key:"action",set:function(t){var e=0<arguments.length&&void 0!==t?t:"copy";if(this._action=e,"copy"!==this._action&&"cut"!==this._action)throw new Error('Invalid "action" value, use either "copy" or "cut"')},get:function(){return this._action}},{key:"target",set:function(t){if(void 0!==t){if(!t||"object"!==(void 0===t?"undefined":i(t))||1!==t.nodeType)throw new Error('Invalid "target" value, use a valid Element');if("copy"===this.action&&t.hasAttribute("disabled"))throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');if("cut"===this.action&&(t.hasAttribute("readonly")||t.hasAttribute("disabled")))throw new Error('Invalid "target" attribute. You can\'t cut text from elements with "readonly" or "disabled" attributes');this._target=t}},get:function(){return this._target}}]),c),u=n(1),s=n.n(u),f=n(2),d=n.n(f),h="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},p=function(t,e,n){return e&&y(t.prototype,e),n&&y(t,n),t};function y(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}var m=(function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}(v,s.a),p(v,[{key:"resolveOptions",value:function(t){var e=0<arguments.length&&void 0!==t?t:{};this.action="function"==typeof e.action?e.action:this.defaultAction,this.target="function"==typeof e.target?e.target:this.defaultTarget,this.text="function"==typeof e.text?e.text:this.defaultText,this.container="object"===h(e.container)?e.container:document.body}},{key:"listenClick",value:function(t){var e=this;this.listener=d()(t,"click",function(t){return e.onClick(t)})}},{key:"onClick",value:function(t){var e=t.delegateTarget||t.currentTarget;this.clipboardAction&&(this.clipboardAction=null),this.clipboardAction=new l({action:this.action(e),target:this.target(e),text:this.text(e),container:this.container,trigger:e,emitter:this})}},{key:"defaultAction",value:function(t){return b("action",t)}},{key:"defaultTarget",value:function(t){var e=b("target",t);if(e)return document.querySelector(e)}},{key:"defaultText",value:function(t){return b("text",t)}},{key:"destroy",value:function(){this.listener.destroy(),this.clipboardAction&&(this.clipboardAction.destroy(),this.clipboardAction=null)}}],[{key:"isSupported",value:function(t){var e=0<arguments.length&&void 0!==t?t:["copy","cut"],n="string"==typeof e?[e]:e,o=!!document.queryCommandSupported;return n.forEach(function(t){o=o&&!!document.queryCommandSupported(t)}),o}}]),v);function v(t,e){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,v);var n=function(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}(this,(v.__proto__||Object.getPrototypeOf(v)).call(this));return n.resolveOptions(e),n.listenClick(t),n}function b(t,e){var n="data-clipboard-"+t;if(e.hasAttribute(n))return e.getAttribute(n)}e.default=m}],r.c=o,r.d=function(t,e,n){r.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:n})},r.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)r.d(n,o,function(t){return e[t]}.bind(null,o));return n},r.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return r.d(e,"a",e),e},r.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},r.p="",r(r.s=6).default;function r(t){if(o[t])return o[t].exports;var e=o[t]={i:t,l:!1,exports:{}};return n[t].call(e.exports,e,e.exports,r),e.l=!0,e.exports}var n,o});
</script>

<!-- ==================== VLOOK UI ==================== -->

<!-- 欢迎屏 -->
<div class="mdx-load-screen mdx-backdrop-blurs">
    <!-- 文档专属图标 -->
    <div class="mdx-doc-logo"></div>
    <!-- 欢迎信息 -->
    <div class="mdx-load-screen-tips">
        <div>不要著急，最好的總會在最不經意的時候出現。</div>
        <div>Don't worry, the best will always appear in the most casual time.</div>
        <div>心配しないで、最高のものが常に最もカジュアルな時間に表示されます。</div>
        <div>Ne vous inquiétez pas, le meilleur apparaîtra toujours au moment le plus décontracté.</div>
        <div>걱정하지 마십시오. 최고는 항상 가장 우연한 시간에 나타납니다.</div>
        <div>Не волнуйтесь, лучшее всегда будет появляться в самое случайное время.<br><br>:</div>
    </div>
    <!-- 文档加载进度及进入按钮 -->
    <div class="mdx-btn-load-screen">
        Loading...
    </div>
</div>
<!-- SVG图标集 -->
<svg style="display: none;">
    <!-- 图标|VLOOK LOGO for Light Mode -->
    <symbol id="icoVLOOK-light">
        <g id="VLOOK-light">
            <path d="M6.89838077,-8.30290747e-16 L17.1976192,-2.76763582e-16 C19.5796459,-7.14334776e-16 20.4434263,0.24801843 21.3142596,0.713745193 C22.1850929,1.17947196 22.868528,1.86290705 23.3342548,2.73374039 C23.7999816,3.60457372 24.048,4.46835414 24.048,6.85038077 L24.048,17.1496192 C24.048,19.5316459 23.7999816,20.3954263 23.3342548,21.2662596 C22.868528,22.1370929 22.1850929,22.820528 21.3142596,23.2862548 C20.4434263,23.7519816 19.5796459,24 17.1976192,24 L6.89838077,24 C4.51635414,24 3.65257372,23.7519816 2.78174039,23.2862548 C1.91090705,22.820528 1.22747196,22.1370929 0.761745193,21.2662596 C0.29601843,20.3954263 0.048,19.5316459 0.048,17.1496192 L0.048,6.85038077 C0.048,4.46835414 0.29601843,3.60457372 0.761745193,2.73374039 C1.22747196,1.86290705 1.91090705,1.17947196 2.78174039,0.713745193 C3.65257372,0.24801843 4.51635414,-3.92719553e-16 6.89838077,-8.30290747e-16 Z" id="Path" fill="#000000"></path>
            <g id="Combined-Shape" transform="translate(1.968000, 3.791553)" fill="#FFFFFF">
                <path d="M10.2643731,13.8820909 L11.3211911,14.7627725 C11.4342593,14.856996 11.4580902,15.0213112 11.3764485,15.1437739 L10.3196305,16.7290009 C10.231401,16.8613451 10.0525906,16.8971072 9.92024634,16.8088777 C9.88860888,16.7877861 9.86146115,16.7606383 9.84036952,16.7290009 L8.78355153,15.1437739 C8.70190976,15.0213112 8.72574073,14.856996 8.83880891,14.7627725 L9.89562689,13.8820909 C10.0024305,13.7930878 10.1575695,13.7930878 10.2643731,13.8820909 Z M4.8,5.0884466 C7.4509668,5.0884466 9.6,7.2374798 9.6,9.8884466 C9.6,12.5394134 7.4509668,14.6884466 4.8,14.6884466 C2.1490332,14.6884466 0,12.5394134 0,9.8884466 C0,7.2374798 2.1490332,5.0884466 4.8,5.0884466 Z M15.36,5.0884466 C18.0109668,5.0884466 20.16,7.2374798 20.16,9.8884466 C20.16,12.5394134 18.0109668,14.6884466 15.36,14.6884466 C12.7090332,14.6884466 10.56,12.5394134 10.56,9.8884466 C10.56,7.2374798 12.7090332,5.0884466 15.36,5.0884466 Z M4.8,6.5284466 C2.94432324,6.5284466 1.44,8.03276984 1.44,9.8884466 C1.44,11.7441234 2.94432324,13.2484466 4.8,13.2484466 C6.65567676,13.2484466 8.16,11.7441234 8.16,9.8884466 C8.16,8.03276984 6.65567676,6.5284466 4.8,6.5284466 Z M15.36,6.5284466 C13.5043232,6.5284466 12,8.03276984 12,9.8884466 C12,11.7441234 13.5043232,13.2484466 15.36,13.2484466 C17.2156768,13.2484466 18.72,11.7441234 18.72,9.8884466 C18.72,8.03276984 17.2156768,6.5284466 15.36,6.5284466 Z M10.0456314,4.68597195 L10.0345413,4.68601414 C9.94014911,4.68504496 9.84450891,4.66539949 9.75292849,4.62514585 L9.73808055,4.61842168 L2.77763675,1.37271343 C2.41724797,1.20466138 2.26132824,0.77627545 2.42938029,0.415886672 C2.59513025,0.0604347271 3.01413052,-0.0961116904 3.37135911,0.0609060409 L3.38620704,0.0676302143 L10.049,3.174 L16.7120241,0.0676302143 L16.7268721,0.0609060409 C17.0841006,-0.0961116904 17.5031009,0.0604347271 17.6688509,0.415886672 C17.8369029,0.77627545 17.6809832,1.20466138 17.3205944,1.37271343 L17.3205944,1.37271343 L10.3601506,4.61842168 L10.3453027,4.62514585 C10.2536644,4.66542493 10.1579612,4.68506979 10.0635109,4.68601595 C10.0600214,4.68583226 10.0563118,4.68591651 10.0525998,4.68597195 L10.0456314,4.68597195 Z"></path>
            </g>
        </g>
    </symbol>
    <!-- 图标|VLOOK LOGO for Dark Mode -->
    <symbol id="icoVLOOK-dark">
        <g id="VLOOK-dark">
            <path d="M6.89838077,-1.66058149e-15 L17.1976192,-1.10705433e-15 C19.5796459,-1.54462552e-15 20.4434263,0.24801843 21.3142596,0.713745193 C22.1850929,1.17947196 22.868528,1.86290705 23.3342548,2.73374039 C23.7999816,3.60457372 24.048,4.46835414 24.048,6.85038077 L24.048,17.1496192 C24.048,19.5316459 23.7999816,20.3954263 23.3342548,21.2662596 C22.868528,22.1370929 22.1850929,22.820528 21.3142596,23.2862548 C20.4434263,23.7519816 19.5796459,24 17.1976192,24 L6.89838077,24 C4.51635414,24 3.65257372,23.7519816 2.78174039,23.2862548 C1.91090705,22.820528 1.22747196,22.1370929 0.761745193,21.2662596 C0.29601843,20.3954263 0.048,19.5316459 0.048,17.1496192 L0.048,6.85038077 C0.048,4.46835414 0.29601843,3.60457372 0.761745193,2.73374039 C1.22747196,1.86290705 1.91090705,1.17947196 2.78174039,0.713745193 C3.65257372,0.24801843 4.51635414,-1.2230103e-15 6.89838077,-1.66058149e-15 Z" id="Path" fill="#FFFFFF"></path>
            <g id="Combined-Shape" transform="translate(1.968000, 3.791553)" fill="#121418">
                <path d="M10.2643731,13.8820909 L11.3211911,14.7627725 C11.4342593,14.856996 11.4580902,15.0213112 11.3764485,15.1437739 L10.3196305,16.7290009 C10.231401,16.8613451 10.0525906,16.8971072 9.92024634,16.8088777 C9.88860888,16.7877861 9.86146115,16.7606383 9.84036952,16.7290009 L8.78355153,15.1437739 C8.70190976,15.0213112 8.72574073,14.856996 8.83880891,14.7627725 L9.89562689,13.8820909 C10.0024305,13.7930878 10.1575695,13.7930878 10.2643731,13.8820909 Z M4.8,5.0884466 C7.4509668,5.0884466 9.6,7.2374798 9.6,9.8884466 C9.6,12.5394134 7.4509668,14.6884466 4.8,14.6884466 C2.1490332,14.6884466 0,12.5394134 0,9.8884466 C0,7.2374798 2.1490332,5.0884466 4.8,5.0884466 Z M15.36,5.0884466 C18.0109668,5.0884466 20.16,7.2374798 20.16,9.8884466 C20.16,12.5394134 18.0109668,14.6884466 15.36,14.6884466 C12.7090332,14.6884466 10.56,12.5394134 10.56,9.8884466 C10.56,7.2374798 12.7090332,5.0884466 15.36,5.0884466 Z M4.8,6.5284466 C2.94432324,6.5284466 1.44,8.03276984 1.44,9.8884466 C1.44,11.7441234 2.94432324,13.2484466 4.8,13.2484466 C6.65567676,13.2484466 8.16,11.7441234 8.16,9.8884466 C8.16,8.03276984 6.65567676,6.5284466 4.8,6.5284466 Z M15.36,6.5284466 C13.5043232,6.5284466 12,8.03276984 12,9.8884466 C12,11.7441234 13.5043232,13.2484466 15.36,13.2484466 C17.2156768,13.2484466 18.72,11.7441234 18.72,9.8884466 C18.72,8.03276984 17.2156768,6.5284466 15.36,6.5284466 Z M10.0456314,4.68597195 L10.0345413,4.68601414 C9.94014911,4.68504496 9.84450891,4.66539949 9.75292849,4.62514585 L9.73808055,4.61842168 L2.77763675,1.37271343 C2.41724797,1.20466138 2.26132824,0.77627545 2.42938029,0.415886672 C2.59513025,0.0604347271 3.01413052,-0.0961116904 3.37135911,0.0609060409 L3.38620704,0.0676302143 L10.049,3.174 L16.7120241,0.0676302143 L16.7268721,0.0609060409 C17.0841006,-0.0961116904 17.5031009,0.0604347271 17.6688509,0.415886672 C17.8369029,0.77627545 17.6809832,1.20466138 17.3205944,1.37271343 L17.3205944,1.37271343 L10.3601506,4.61842168 L10.3453027,4.62514585 C10.2536644,4.66542493 10.1579612,4.68506979 10.0635109,4.68601595 C10.0600214,4.68583226 10.0563118,4.68591651 10.0525998,4.68597195 L10.0456314,4.68597195 Z"></path>
            </g>
        </g>
    </symbol>
    <!-- 图标|大纲 -->
    <symbol id="icoOutline">
        <path d="M6,0 L19,0 C19.5522847,0 20,0.44771525 20,1 C20,1.55228475 19.5522847,2 19,2 L6,2 C5.44771525,2 5,1.55228475 5,1 C5,0.44771525 5.44771525,0 6,0 Z M1,0 L2,0 C2.55228475,0 3,0.44771525 3,1 C3,1.55228475 2.55228475,2 2,2 L1,2 C0.44771525,2 0,1.55228475 0,1 C0,0.44771525 0.44771525,0 1,0 Z M1,6 L2,6 C2.55228475,6 3,6.44771525 3,7 C3,7.55228475 2.55228475,8 2,8 L1,8 C0.44771525,8 0,7.55228475 0,7 C0,6.44771525 0.44771525,6 1,6 Z M1,12 L2,12 C2.55228475,12 3,12.4477153 3,13 C3,13.5522847 2.55228475,14 2,14 L1,14 C0.44771525,14 0,13.5522847 0,13 C0,12.4477153 0.44771525,12 1,12 Z M6,6 L19,6 C19.5522847,6 20,6.44771525 20,7 C20,7.55228475 19.5522847,8 19,8 L6,8 C5.44771525,8 5,7.55228475 5,7 C5,6.44771525 5.44771525,6 6,6 Z M6,12 L19,12 C19.5522847,12 20,12.4477153 20,13 C20,13.5522847 19.5522847,14 19,14 L6,14 C5.44771525,14 5,13.5522847 5,13 C5,12.4477153 5.44771525,12 6,12 Z">
        </path>
    </symbol>
    <!-- 图标|插图导航的上一张 -->
    <symbol id="icoPrevFig">
        <path d="M11.0303682,0.091084328 C11.7948436,0.375093579 12.1890102,1.237894 11.9107639,2.018203 L3.00130389,26.9997408 L11.9107639,51.981797 C12.1726428,52.7162055 11.8388895,53.5236859 11.1613701,53.8529228 L11.0303682,53.9089157 C10.310862,54.1762185 9.51976648,53.8355526 9.19721032,53.1440006 L9.14235361,53.0102855 C5.13199059,41.7636939 2.12421833,33.3287502 0.11903682,27.7054544 C0.11186687,27.6853471 0,27.43485 0,26.9997408 C0,26.5646315 0.111310594,26.3162129 0.119265149,26.2939053 C2.12439592,20.6707518 5.13209207,12.2360215 9.14235361,0.989714523 C9.4205999,0.20940552 10.2658928,-0.192924923 11.0303682,0.091084328 Z">
        </path>
    </symbol>
    <!-- 图标|插图导航的下一张 -->
    <symbol id="icoNextFig">
        <path d="M11.0303682,0.091084328 C11.7948436,0.375093579 12.1890102,1.237894 11.9107639,2.018203 L3.00130389,26.9997408 L11.9107639,51.981797 C12.1726428,52.7162055 11.8388895,53.5236859 11.1613701,53.8529228 L11.0303682,53.9089157 C10.310862,54.1762185 9.51976648,53.8355526 9.19721032,53.1440006 L9.14235361,53.0102855 C5.13199059,41.7636939 2.12421833,33.3287502 0.11903682,27.7054544 C0.11186687,27.6853471 0,27.43485 0,26.9997408 C0,26.5646315 0.111310594,26.3162129 0.119265149,26.2939053 C2.12439592,20.6707518 5.13209207,12.2360215 9.14235361,0.989714523 C9.4205999,0.20940552 10.2658928,-0.192924923 11.0303682,0.091084328 Z" transform="translate(6.000000, 27.000000) scale(-1, 1) translate(-6.000000, -27.000000) ">
        </path>
    </symbol>
    <!-- 图标|逐章导航的上一章 -->
    <symbol id="icoPrevChapter">
        <path d="M2.56507664,7.09086552 L7.5381691,12.063958 C7.92869339,12.4544823 7.92869339,13.0876472 7.5381691,13.4781715 C7.14764481,13.8686958 6.51447983,13.8686958 6.12395554,13.4781715 L0.467101288,7.82131729 C0.287321184,7.64153719 0.190303885,7.41033487 0.176049391,7.17505536 C0.145971879,6.88568746 0.241806749,6.58570828 0.463554001,6.36396103 L6.12040825,0.707106781 C6.51093254,0.316582489 7.14409752,0.316582489 7.53462181,0.707106781 C7.9251461,1.09763107 7.9251461,1.73079605 7.53462181,2.12132034 L2.56507664,7.09086552 Z">
        </path>
    </symbol>
    <!-- 图标|逐章导航的下一章 -->
    <symbol id="icoNextChapter">
        <path d="M2.73310223,7.09086552 L7.70619469,12.063958 C8.09671898,12.4544823 8.09671898,13.0876472 7.70619469,13.4781715 C7.3156704,13.8686958 6.68250542,13.8686958 6.29198113,13.4781715 L0.635126876,7.82131729 C0.455346772,7.64153719 0.358329473,7.41033487 0.344074979,7.17505536 C0.313997467,6.88568746 0.409832337,6.58570828 0.631579589,6.36396103 L6.28843384,0.707106781 C6.67895813,0.316582489 7.31212311,0.316582489 7.7026474,0.707106781 C8.09317169,1.09763107 8.09317169,1.73079605 7.7026474,2.12132034 L2.73310223,7.09086552 Z"transform="translate(4.168887, 7.092639) scale(-1, 1) translate(-4.168887, -7.092639) ">
        </path>
    </symbol>
    <!-- 图标|已收起的大纲节点 -->
    <symbol id="icoFolded">
        <path d="M10,2 C14.418278,2 18,5.581722 18,10 C18,14.418278 14.418278,18 10,18 C5.581722,18 2,14.418278 2,10 C2,5.581722 5.581722,2 10,2 Z M9.36396103,5.05025253 C8.97343674,4.65972824 8.34027176,4.65972824 7.94974747,5.05025253 C7.55922318,5.44077682 7.55922318,6.0739418 7.94974747,6.46446609 L7.94974747,6.46446609 L11.4852814,10 L7.94974747,13.5355339 C7.55922318,13.9260582 7.55922318,14.5592232 7.94974747,14.9497475 C8.34027176,15.3402718 8.97343674,15.3402718 9.36396103,14.9497475 L9.36396103,14.9497475 L13.6066017,10.7071068 C13.997126,10.3165825 13.997126,9.68341751 13.6066017,9.29289322 L13.6066017,9.29289322 Z">
        </path>
    </symbol>
    <!-- 图标|已展开的大纲节点 -->
    <symbol id="icoUnfold">
        <path d="M13,4.65685425 C13.5522847,4.65685425 14,5.1045695 14,5.65685425 C14,6.209139 13.5522847,6.65685425 13,6.65685425 L8,6.65685425 L8,11.6568542 C8,12.209139 7.55228475,12.6568542 7,12.6568542 C6.44771525,12.6568542 6,12.209139 6,11.6568542 L6,5.65685425 C6,5.1045695 6.44771525,4.65685425 7,4.65685425 L13,4.65685425 Z" transform="translate(10.000000, 8.656854) rotate(-135.000000) translate(-10.000000, -8.656854) ">
        </path>
    </symbol>
    <!-- 图标|展开长内容 -->
    <symbol id="icoExtend">
        <path d="M13,1.65685425 C13.5522847,1.65685425 14,2.1045695 14,2.65685425 C14,3.209139 13.5522847,3.65685425 13,3.65685425 L8,3.65685425 L8,8.65685425 C8,9.209139 7.55228475,9.65685425 7,9.65685425 C6.44771525,9.65685425 6,9.209139 6,8.65685425 L6,2.65685425 C6,2.1045695 6.44771525,1.65685425 7,1.65685425 L13,1.65685425 Z" transform="translate(10.000000, 5.656854) rotate(-135.000000) translate(-10.000000, -5.656854) "></path>
        <path d="M13,7.65685425 C13.5522847,7.65685425 14,8.1045695 14,8.65685425 C14,9.209139 13.5522847,9.65685425 13,9.65685425 L8,9.65685425 L8,14.6568542 C8,15.209139 7.55228475,15.6568542 7,15.6568542 C6.44771525,15.6568542 6,15.209139 6,14.6568542 L6,8.65685425 C6,8.1045695 6.44771525,7.65685425 7,7.65685425 L13,7.65685425 Z" transform="translate(10.000000, 11.656854) rotate(-135.000000) translate(-10.000000, -11.656854) "></path>
    </symbol>
    <!-- 图标|关闭 -->
    <symbol id="icoClose">
        <path d="M7,7 L7,-1 C7,-1.55228475 7.44771525,-2 8,-2 C8.55228475,-2 9,-1.55228475 9,-1 L9,7 L17,7 C17.5522847,7 18,7.44771525 18,8 C18,8.55228475 17.5522847,9 17,9 L9,9 L9,17 C9,17.5522847 8.55228475,18 8,18 C7.44771525,18 7,17.5522847 7,17 L7,9 L-1,9 C-1.55228475,9 -2,8.55228475 -2,8 C-2,7.44771525 -1.55228475,7 -1,7 L7,7 Z" transform="translate(8.000000, 8.000000) rotate(45.000000) translate(-8.000000, -8.000000) ">
        </path>
    </symbol>
    <!-- 图标|插图导航 -->
    <symbol id="icoFigure">
        <path d="M2,0 L15,0 C16.1045695,-2.02906125e-16 17,0.8954305 17,2 L17,12 C17,13.1045695 16.1045695,14 15,14 L2,14 C0.8954305,14 -1.13551567e-13,13.1045695 -1.13686838e-13,12 L-1.13686838e-13,2 C-1.13822108e-13,0.8954305 0.8954305,2.02906125e-16 2,0 Z M11,6 C12.1045695,6 13,5.1045695 13,4 C13,2.8954305 12.1045695,2 11,2 C9.8954305,2 9,2.8954305 9,4 C9,5.1045695 9.8954305,6 11,6 Z M2.03225639,10.5528128 C1.96084272,10.6932426 1.92361915,10.8485585 1.92361915,11.0061035 C1.92361915,11.5583883 2.3713344,12.0061035 2.92361915,12.0061035 L14.2120421,12.0061035 C14.4392714,12.0061035 14.6597254,11.9287155 14.8370963,11.7866848 C15.2681995,11.4414769 15.3378313,10.8121525 14.9926234,10.3810493 L12.9645536,7.84835144 C12.6449335,7.44920285 12.075683,7.35548344 11.6449719,7.63110012 L9.29545309,9.13458249 C9.28589453,9.14069912 9.27623255,9.14665259 9.26647134,9.15244033 C8.79141623,9.43411583 8.17796486,9.27735069 7.89628936,8.80229559 L6.14615975,5.85064382 C6.04943866,5.68752049 5.90832711,5.55526275 5.73928706,5.46929968 C5.247001,5.21895416 4.64497916,5.41508571 4.39463363,5.90737177 L2.03225639,10.5528128 Z M18,12.5 L18,2 C19.1045695,2 20,2.8954305 20,4 L20,15 C20,16.1045695 19.1045695,17 18,17 L4,17 C2.8954305,17 2,16.1045695 2,15 L15.5,15 C16.8807119,15 18,13.8807119 18,12.5 Z">
        </path>
    </symbol>
    <!-- 图标|图片墙 -->
    <symbol id="icoFigureGrid">
        <rect height="6" id="Rectangle-5" rx="1" width="6" x="0" y="0"></rect>
        <rect height="6" id="Rectangle-5-Copy" rx="1" width="6" x="8" y="0"></rect>
        <rect height="6" id="Rectangle-5-Copy-2" rx="1" width="6" x="16" y="0"></rect>
        <rect height="6" id="Rectangle-5-Copy-5" rx="1" width="6" x="0" y="8"></rect>
        <rect height="6" id="Rectangle-5-Copy-4" rx="1" width="6" x="8" y="8"></rect>
        <rect height="6" id="Rectangle-5-Copy-3" rx="1" width="6" x="16" y="8"></rect>
    </symbol>
    <!-- 图标|亮色模式 -->
    <symbol id="icoLightMode">
        <path d="M10.8333333,0.83333334 L10.8333333,2.5 C10.8333333,2.9602373 10.4602373,3.33333334 10,3.33333334 C9.5397627,3.33333334 9.16666666,2.9602373 9.16666666,2.5 L9.16666666,0.83333334 C9.16666666,0.373096045 9.5397627,8.45442195e-17 10,0 C10.4602373,-8.45442195e-17 10.8333333,0.373096045 10.8333333,0.83333334 Z M10,16.6666667 C9.5397627,16.6666667 9.16666666,17.0397627 9.16666666,17.5 L9.16666666,19.1666667 C9.16666666,19.626904 9.5397627,20 10,20 C10.4602373,20 10.8333333,19.626904 10.8333333,19.1666667 L10.8333333,17.5 C10.8333333,17.0397627 10.4602373,16.6666667 10,16.6666667 Z M2.92895834,2.92895834 C2.77266874,3.08523989 2.68486548,3.29720799 2.68486548,3.51822917 C2.68486548,3.73925035 2.77266874,3.95121845 2.92895834,4.1075 L4.1075,5.28604166 C4.43294529,5.61148694 4.96059636,5.61148694 5.28604165,5.28604165 C5.61148694,4.96059636 5.61148694,4.43294529 5.28604166,4.1075 L4.1075,2.92895834 C3.95121845,2.77266874 3.73925035,2.68486548 3.51822917,2.68486548 C3.29720799,2.68486548 3.08523989,2.77266874 2.92895834,2.92895834 Z M14.7139583,14.7139583 C14.3886401,15.0393749 14.3886401,15.5668751 14.7139583,15.8922917 L14.7139583,15.8925 L15.8925,17.0710417 C16.1030262,17.2815679 16.4098748,17.3637877 16.6974589,17.2867298 C16.985043,17.2096718 17.2096718,16.985043 17.2867298,16.6974589 C17.3637877,16.4098748 17.2815679,16.1030262 17.0710417,15.8925 L15.8925,14.7139583 C15.7362456,14.5576177 15.5242673,14.4697791 15.3032292,14.4697791 C15.082191,14.4697791 14.8702128,14.5576177 14.7139583,14.7139583 Z M0,10 C5.6362813e-17,10.4602373 0.373096045,10.8333333 0.83333334,10.8333333 L2.5,10.8333333 C2.9602373,10.8333333 3.33333334,10.4602373 3.33333334,10 C3.33333334,9.5397627 2.9602373,9.16666666 2.5,9.16666666 L0.83333334,9.16666666 C0.373096045,9.16666666 5.6362813e-17,9.5397627 0,10 Z M16.6666667,10 C16.6666667,10.4602373 17.0397627,10.8333333 17.5,10.8333333 L19.1666667,10.8333333 C19.626904,10.8333333 20,10.4602373 20,10 C20,9.5397627 19.626904,9.16666666 19.1666667,9.16666666 L17.5,9.16666666 C17.0397627,9.16666666 16.6666667,9.5397627 16.6666667,10 Z M2.92895834,17.0710417 C3.08523989,17.2273313 3.29720799,17.3151345 3.51822917,17.3151345 C3.73925035,17.3151345 3.95121845,17.2273313 4.1075,17.0710417 L5.28583334,15.8925 C5.60509309,15.5660706 5.60221508,15.0435127 5.27937916,14.7206197 C4.95654324,14.3977267 4.43398579,14.3947563 4.1075,14.7139583 L2.92895834,15.8925 C2.77266874,16.0487816 2.68486548,16.2607497 2.68486548,16.4817708 C2.68486548,16.702792 2.77266874,16.9147601 2.92895834,17.0710417 Z M14.7139583,5.28604166 C15.0393749,5.61135993 15.5668751,5.61135993 15.8922917,5.28604166 L15.8925,5.28604166 L17.0710417,4.1075 C17.396487,3.78205471 17.396487,3.25440363 17.0710417,2.92895834 C16.7455964,2.60351305 16.2179453,2.60351305 15.8925,2.92895834 L14.7139583,4.1075 C14.5576177,4.26375444 14.4697791,4.4757327 14.4697791,4.69677083 C14.4697791,4.91780896 14.5576177,5.12978722 14.7139583,5.28604166 Z M15,10 C15,12.7614583 12.7614583,15 10,15 C7.23854166,15 5,12.7614583 5,10 C5,7.23854166 7.23854166,5 10,5 C12.7614583,5 15,7.23854166 15,10 Z">
        </path>
    </symbol>
    <!-- 图标|深色模式 -->
    <symbol id="icoDarkMode">
        <path d="M4.1439375,12.4783274 C8.7496875,12.4783274 12.4801875,8.74489828 12.4801875,4.14181693 C12.4801875,2.62583206 12.045375,1.22347573 11.33775,0 C15.17625,1.10703459 18,4.60533142 18,8.800025 C18,13.8801213 13.8825,18 8.802,18 C4.6074375,18 1.107,15.1744742 0,11.3375418 C1.22625,12.0429388 2.628,12.4783274 4.1439375,12.4783274 Z M4.44974747,8.44974747 L3.74264069,10.2426407 L3.03553391,8.44974747 L1.24264069,7.74264069 L3.03553391,7.03553391 L3.74264069,5.24264069 L4.44974747,7.03553391 L6.24264069,7.74264069 L4.44974747,8.44974747 Z M8.39411255,4.39411255 L7.82842712,5.82842712 L7.2627417,4.39411255 L5.82842712,3.82842712 L7.2627417,3.2627417 L7.82842712,1.82842712 L8.39411255,3.2627417 L9.82842712,3.82842712 L8.39411255,4.39411255 Z M3.75269119,2.75269119 L3.32842712,3.82842712 L2.90416306,2.75269119 L1.82842712,2.32842712 L2.90416306,1.90416306 L3.32842712,0.828427125 L3.75269119,1.90416306 L4.82842712,2.32842712 L3.75269119,2.75269119 Z">
        </path>
    </symbol>
    <!-- 图标|聚光灯 -->
    <symbol id="icoSpotlight">
        <path d="M11.1949511,14.3025696 L9.89553711,18.0009016 C9.79558219,18.5006762 9.19585266,19.0004508 8.3962133,19.4002705 C7.49661902,19.8000902 6.29715998,20 4.99774602,20 C3.69833205,20 2.49887301,19.8000902 1.59927873,19.4002705 C0.599729531,18.9004959 0,18.2008114 0,17.501127 C0,17.1013073 0.199909844,16.7014876 0.399819687,16.4016229 L8.59612314,7.40568004 L10.8950863,4.90680703 L15.093193,0.208925781 C15.2931028,0.0090159375 15.5929676,0.00901595703 15.7928774,0.108970859 C15.9927872,0.208925762 16.0927422,0.508790527 15.9927872,0.708700371 L13.4939142,7.90545465 L11.1949511,14.3025696 Z M11.7640774,15.7965261 L14.2708176,8.82245531 L19.5911644,15.1022089 C19.8910291,15.4020737 19.9909841,15.8018933 19.9909841,16.0018032 C19.9909841,16.4016229 19.7910742,17.0013524 18.6915701,17.501127 C17.8919307,17.8009918 16.9923364,18.0009016 15.9927872,18.0009016 C14.993238,18.0009016 13.9936888,17.8009918 13.2940044,17.6010819 C12.3944101,17.2012622 12.0945454,16.8014426 11.9945904,16.4016229 L11.7640774,15.7965261 Z M8.17832315,6.3290416 L5.99729521,0.708700371 C5.89734029,0.508790547 5.89734029,0.308880703 6.19720506,0.108970859 C6.49706982,-0.0909389844 6.69697967,0.0090159375 6.89688951,0.208925781 L10.218134,4.11138806 L8.17832315,6.3290416 Z M7.99639363,18.5006762 C8.59612314,18.2008114 8.99594283,17.9009467 8.99594283,17.501127 C8.99594283,17.1013073 8.59612316,16.8014426 7.99639363,16.5015778 C7.19675426,16.201713 6.09725016,16.0018032 4.99774602,16.0018032 C3.89824188,16.0018032 2.79873775,16.201713 1.9990984,16.5015778 C1.39936889,16.8014426 0.999549199,17.1013073 0.999549199,17.501127 C0.999549199,17.9009467 1.39936887,18.2008114 1.9990984,18.5006762 C2.79873777,18.800541 3.89824188,19.0004508 4.99774602,19.0004508 C6.09725016,19.0004508 7.19675428,18.800541 7.99639363,18.5006762 Z M12.9941396,16.0018032 C12.9940532,16.3589269 13.5655733,16.6889352 14.4933936,16.8675054 C15.4212139,17.0460756 16.5643606,17.0460756 17.4921809,16.8675054 C18.4200012,16.6889352 18.9915213,16.3589269 18.9914349,16.0018032 C18.9915213,15.6446794 18.4200012,15.3146712 17.4921809,15.136101 C16.5643606,14.9575308 15.4212139,14.9575308 14.4933936,15.136101 C13.5655733,15.3146712 12.9940532,15.6446794 12.9941396,16.0018032 Z">
        </path>
    </symbol>
    <!-- 图标|非衬线字体风格 -->
    <symbol id="icoFont-sans">
        <path d="M18,16 L14.0598232,16 L12.4935418,12.2464833 L5.32290959,12.2464833 L3.84228416,16 L0,16 L6.98708362,0 L10.8171312,0 L18,16 Z M11.3310673,9.55987559 L8.8592794,3.62602064 L6.4364378,9.55987559 L11.3310673,9.55987559 Z">
        </path>
    </symbol>
    <!-- 图标|衬线字体风格 -->
    <symbol id="icoFont-serif">
        <path d="M10.45,11.2169143 L4.4625,11.2169143 L3.75,12.8525809 C3.5166655,13.3978058 3.4,13.8480227 3.4,14.203245 C3.4,14.6741211 3.59166475,15.0210772 3.975,15.2441238 C4.20000112,15.3762995 4.75416225,15.4754298 5.6375,15.5415177 L5.6375,16 L0,16 L0,15.5415177 C0.608336375,15.4506469 1.10833138,15.2007559 1.5,14.7918372 C1.89166862,14.3829185 2.37499713,13.5382455 2.95,12.257793 L9.0125,0 L9.25,0 L15.3625,12.6295355 C15.9458363,13.9347709 16.4249981,14.7567265 16.8,15.0954268 C17.0833347,15.3515173 17.4833307,15.5002128 18,15.5415177 L18,16 L9.8,16 L9.8,15.5415177 L10.1375,15.5415177 C10.7958366,15.5415177 11.258332,15.4506482 11.525,15.2689066 C11.7083342,15.1367308 11.8,14.9467311 11.8,14.6989016 C11.8,14.5502038 11.7750002,14.3973779 11.725,14.2404192 C11.7083332,14.1660704 11.5833345,13.8562881 11.35,13.3110632 L10.45,11.2169143 Z M10.025,10.2619342 L7.5,4.49650206 L4.9,10.2619342 L10.025,10.2619342 Z">
        </path>
    </symbol>
    <!-- 图标|打印 -->
    <symbol id="icoPrint">
        <path d="M15,7.38964445e-12 C16.1045695,7.38944155e-12 17,0.8954305 17,2 L17,6 L18,6 C19.1045695,6 20,6.8954305 20,8 L20,14 C20,15.1045695 19.1045695,16 18,16 L17,16 L17,17 C17,18.1045695 16.1045695,19 15,19 L5,19 C3.8954305,19 3,18.1045695 3,17 L3,16 L2,16 C0.8954305,16 1.3527075e-16,15.1045695 0,14 L0,8 C-1.3527075e-16,6.8954305 0.8954305,6 2,6 L3,6 L3,2 C3,0.8954305 3.8954305,7.38984736e-12 5,7.38964445e-12 L15,7.38964445e-12 Z M16,13 L4,13 L4,17 C4,17.5522847 4.44771525,18 5,18 L5,18 L15,18 C15.5522847,18 16,17.5522847 16,17 L16,17 L16,13 Z M14,15 L14,16 L6,16 L6,15 L14,15 Z M17.5,8 L16.5,8 C16.2238576,8 16,8.22385763 16,8.5 C16,8.77614237 16.2238576,9 16.5,9 L16.5,9 L17.5,9 C17.7761424,9 18,8.77614237 18,8.5 C18,8.22385763 17.7761424,8 17.5,8 L17.5,8 Z M14.1275656,8 C13.8514233,8 13.6275656,8.22385763 13.6275656,8.5 C13.6275656,8.77614237 13.8514233,9 14.1275656,9 C14.403708,9 14.6275656,8.77614237 14.6275656,8.5 C14.6275656,8.22385763 14.403708,8 14.1275656,8 Z M15,1 L5,1 C4.44771525,1 4,1.44771525 4,2 L4,2 L4,6 L16,6 L16,2 C16,1.48716416 15.6139598,1.06449284 15.1166211,1.00672773 L15,1 Z">
        </path>
    </symbol>
    <!-- 图标|新标签打开 -->
    <symbol id="icoNewTab">
        <path d="M17.9987947,9 C18.5510794,9 18.9987924,9.44771525 18.9987924,10 L18.9987924,16 C18.9987924,16.5522847 18.5510794,17 17.9987947,17 C17.4465099,17 16.9987947,16.5522847 16.9987947,16 L16.9982218,12.47 L11.7071091,17.7054567 C11.3165848,18.095981 10.6834198,18.095981 10.2928955,17.7054567 C9.90237124,17.3149324 9.90237124,16.6817674 10.2928955,16.2912431 L15.6402218,11 L11.9987947,11 C11.4465099,11 10.9987947,10.5522847 10.9987947,10 C10.9987947,9.44771525 11.4465099,9 11.9987947,9 L17.9987947,9 Z">
        </path>
        <path d="M1,5 L1,13.499817 C1,14.2795131 1.59488808,14.9202656 2.35553999,14.9929504 L2.5,14.999817 L8.51827299,14.999817 C8.79441537,14.999817 9.01827299,15.2236746 9.01827299,15.499817 C9.01827299,15.7452769 8.84139783,15.9494253 8.60814863,15.9917613 L8.51827299,15.999817 L2.5,15.999817 C1.1745166,15.999817 0.089961328,14.968281 0.00531767968,13.6641926 L0,13.499817 L0,2.5 C0,1.1745166 1.03153594,0.089961328 2.33562431,0.00531767968 L2.5,-1.95399252e-14 L16.5,-1.95399252e-14 C17.8254834,-1.95399252e-14 18.9100387,1.03153594 18.9946823,2.33562431 L19,2.5 L19,6.49976186 C19,6.77590424 18.7761424,6.99976186 18.5,6.99976186 C18.2545401,6.99976186 18.0503916,6.8228867 18.0080557,6.58963749 L18,6.49976186 L18,5 L1,5 Z M1,4 L18,4 L18,2.5 C18,1.72030388 17.4051119,1.07955132 16.64446,1.00686658 L16.5,1 L2.5,1 C1.72030388,1 1.07955132,1.59488808 1.00686658,2.35553999 L1,2.5 L1,4 Z">
        </path>
    </symbol>
    <!-- 图标|复制代码块 -->
    <symbol id="icoCopyCodeBlock">
        <path d="M15.91965,0 C17.0679061,0.0012395937 17.998512,0.931644206 18,2.07989999 L18,13.6701 C17.998512,14.8183558 17.0679061,15.7487604 15.91965,15.75 L13.05,15.75 L13.05,15.9201 C13.0487599,17.068283 12.118283,17.9987599 10.9701,18 L2.07989999,18 C0.931716995,17.9987599 0.00124007732,17.068283 0,15.9201 L0,4.32989999 C0.00124007732,3.18171699 0.931716995,2.25124007 2.07989999,2.25 L4.95,2.25 L4.95,2.07989999 C4.95148801,0.931644206 5.88209392,0.0012395937 7.03035,0 L15.91965,0 Z M2.08035,16.65 L10.96965,16.65 C11.3725278,16.6492579 11.6990096,16.3229773 11.7,15.9201 L11.7,4.32989999 C11.7,3.92759999 11.3724,3.6 10.9701,3.6 L2.08035,3.6 C1.67805,3.6 1.34999999,3.92759999 1.34999999,4.32989999 L1.34999999,15.9201 C1.34999999,16.32285 1.67805,16.65 2.08035,16.65 Z M9.22500001,6.29999999 C9.5977922,6.29999999 9.89999998,6.6022078 9.89999998,6.97499999 C9.89999998,7.34779219 9.5977922,7.65 9.22500001,7.65 L3.82499999,7.65 C3.45220779,7.65 3.15000001,7.34779219 3.15000001,6.97499999 C3.15000001,6.6022078 3.45220779,6.29999999 3.82499999,6.29999999 L9.22500001,6.29999999 L9.22500001,6.29999999 Z M9.22500001,9.45 C9.5977922,9.45 9.89999998,9.7522078 9.89999998,10.125 C9.89999998,10.4977922 9.5977922,10.8 9.22500001,10.8 L3.82499999,10.8 C3.45220779,10.8 3.15000001,10.4977922 3.15000001,10.125 C3.15000001,9.7522078 3.45220779,9.45 3.82499999,9.45 L9.22500001,9.45 L9.22500001,9.45 Z M7.42500001,12.6 C7.79779221,12.6 8.10000001,12.9022078 8.10000001,13.275 C8.10000001,13.6477922 7.79779221,13.95 7.42500001,13.95 L3.82499999,13.95 C3.45220778,13.95 3.14999999,13.6477922 3.14999999,13.275 C3.14999999,12.9022078 3.45220778,12.6 3.82499999,12.6 L7.42500001,12.6 Z" transform="translate(9.000000, 9.000000) scale(-1, 1) translate(-9.000000, -9.000000) ">
        </path>
    </symbol>
    <!-- 图标|加载中 -->
    <symbol id="icoLoading">
        <g id="loading">
            <rect fill-opacity="0" x="0" y="0" width="16" height="16"></rect>
            <path d="M6.72865086,1.26496983 C6.71911605,1.71977213 6.95629588,2.14416725 7.34865392,2.37436546 C7.74101196,2.60456367 8.2271863,2.60456367 8.61954434,2.37436546 C9.01190238,2.14416725 9.24908222,1.71977213 9.23954741,1.26496983 C9.23959745,0.816309443 9.00026873,0.401708736 8.61172578,0.177364095 C8.22318283,-0.0469805467 7.74446372,-0.0469805467 7.35592077,0.177364095 C6.96737782,0.401708736 6.72804909,0.816309443 6.72809913,1.26496983 L6.72865086,1.26496983 L6.72865086,1.26496983 Z M1.85885777,3.33890086 C1.85885777,4.01230737 2.4047616,4.5582112 3.07816811,4.5582112 C3.75157462,4.5582112 4.29747845,4.01230737 4.29747845,3.33890086 C4.29747845,2.66549435 3.75157462,2.11959052 3.07816811,2.11959052 C2.4047616,2.11959052 1.85885777,2.66549435 1.85885777,3.33890086 L1.85885777,3.33890086 Z M0.00285776562,7.92428017 C0.00293049529,8.5373029 0.499903995,9.03421744 1.11292673,9.03421744 C1.72594946,9.03421744 2.22292296,8.5373029 2.22299569,7.92428017 C2.22292296,7.31125744 1.72594946,6.8143429 1.11292673,6.8143429 C0.499903995,6.8143429 0.00293049529,7.31125744 0.00285776562,7.92428017 Z M1.96809914,12.9275905 C1.96816693,13.4601736 2.39992984,13.8918816 2.93251293,13.8918816 C3.46509602,13.8918816 3.89685893,13.4601736 3.89692672,12.9275905 C3.89685893,12.3950074 3.46509602,11.9632995 2.93251293,11.9632995 C2.39992984,11.9632995 1.96816693,12.3950074 1.96809914,12.9275905 L1.96809914,12.9275905 Z M7.18382328,15.0175215 C7.18382328,15.4809837 7.55953357,15.856694 8.0229957,15.856694 C8.48645782,15.856694 8.86216811,15.4809837 8.86216811,15.0175215 C8.86216811,14.5540594 8.48645782,14.1783491 8.0229957,14.1783491 C7.55953357,14.1783491 7.18382328,14.5540594 7.18382328,15.0175215 Z M12.5874095,13.0920043 C12.5874095,13.4241369 12.8566562,13.6933836 13.1887888,13.6933836 C13.5209214,13.6933836 13.7901681,13.4241369 13.7901681,13.0920043 C13.7901681,12.7598717 13.5209214,12.490625 13.1887888,12.490625 C12.8566562,12.490625 12.5874095,12.7598717 12.5874095,13.0920043 Z M15.0892026,7.90138363 C15.0892026,8.13677119 15.2800219,8.32759052 15.5154095,8.32759052 C15.7507971,8.32759052 15.9416164,8.13677119 15.9416164,7.90138363 C15.9416164,7.66599606 15.7507971,7.47517673 15.5154095,7.47517673 C15.2800219,7.47517673 15.0892026,7.66599606 15.0892026,7.90138363 Z M13.8089267,3.4310388 C13.8089267,3.59916189 13.9452174,3.73545259 14.1133405,3.73545259 C14.2814636,3.73545259 14.4177543,3.59916189 14.4177543,3.4310388 C14.4177543,3.2629157 14.2814636,3.126625 14.1133405,3.126625 C13.9452174,3.126625 13.8089267,3.2629157 13.8089267,3.4310388 Z"></path>
        </g>
    </symbol>
    <!-- 图标|播放 -->
    <symbol id="icoPlay">
        <g id="play">
            <path d="M14.1329221,9.60458431 L6.2734657,15.6325342 C5.34309563,16.2655554 4.05015741,16.0602894 3.38560736,15.1740596 C3.13481735,14.8396114 3,14.4388779 3,14.0278733 L3,1.97197357 C3,0.882882638 3.92685626,-1.95399252e-14 5.07019139,-1.95399252e-14 C5.50166685,-1.95399252e-14 5.92235968,0.128421099 6.2734657,0.367312671 L14.1329221,6.39526252 C15.0632922,7.02828376 15.2787819,8.25988003 14.6142318,9.14610977 C14.4814505,9.32318416 14.318816,9.4781026 14.1329221,9.60458431 Z"></path>
            <rect id="Rectangle" fill-opacity="0" x="0" y="0" width="16" height="16"></rect>
        </g>
    </symbol>
    <!-- 图标|暂停 -->
    <symbol id="icoPause">
        <g id="pause">
            <path d="M4,2 C5.1045695,2 6,2.8954305 6,4 L6,12 C6,13.1045695 5.1045695,14 4,14 L3,14 C1.8954305,14 1,13.1045695 1,12 L1,4 C1,2.8954305 1.8954305,2 3,2 L4,2 Z M13,2 C14.1045695,2 15,2.8954305 15,4 L15,12 C15,13.1045695 14.1045695,14 13,14 L12,14 C10.8954305,14 10,13.1045695 10,12 L10,4 C10,2.8954305 10.8954305,2 12,2 L13,2 Z"></path>
            <rect  fill-opacity="0" x="0" y="0" width="16" height="16"></rect>
        </g>
    </symbol>
    <!-- 图标|停止 -->
    <symbol id="icoStop">
        <g id="stop">
            <rect x="2" y="2" width="12" height="12" rx="2"></rect>
            <rect fill-opacity="0" x="0" y="0" width="16" height="16"></rect>
        </g>
    </symbol>
    <!-- 图标|无法播放 -->
    <symbol id="icoForbidden">
        <g id="forbidden">
            <path d="M3.11014702,4.52295457 C1.18968426,7.22400289 1.82212581,10.9699964 4.52157146,12.8902277 C6.60400096,14.3708881 9.39599904,14.3708881 11.4784285,12.8902277 L3.11014702,4.52295457 Z M4.52157146,3.10977226 L12.889853,11.4770454 C14.8103157,8.77599711 14.1798024,5.03000361 11.4784285,3.10977226 C9.39599904,1.62911194 6.60400096,1.62911194 4.52157146,3.10977226 L4.52157146,3.10977226 Z M8,16 C3.58062184,16 0,12.4178817 0,8.00096397 C0,3.58404627 3.58062184,0 8,0 C12.4193782,0 16,3.58211833 16,8.00096397 C16,12.4198096 12.4193782,16 8,16 Z"></path>
            <rect fill-opacity="0" x="0" y="0" width="16" height="16"></rect>
        </g>
    </symbol>
</svg>

<!-- 遮罩 -->
<div class="mdx-mask mdx-backdrop-blurs">
    <div class="mdx-copyright">
        <svg height="24px" width="24px" style="display: inline-block; vertical-align: middle;">
            <use xlink:href="#icoVLOOK-dark"></use>
        </svg>&nbsp;&nbsp;
        <a href="https://github.com/MadMaxChow/VLOOK" target="_blank"><strong>VLOOK™</strong></a> (V9.19) for
        <a href="https://www.typora.io" target="_blank">Typora</a>. Powered by <strong><a
                href="mailto:67870144@qq.com">MAX丨孟兆</a></strong>
    </div>
</div>

<!-- 大纲面板 -->
<div class="mdx-toc-panel mdx-float-card">
    <div class="mdx-toc-panel-header">
        <div class="mdx-toc-panel-title">大纲</div>
    </div>
    <div class="mdx-toc-panel-body-scroll">
        <div class="mdx-toc-panel-body"></div>
    </div>
    <div class="mdx-toc-panel-footer">
    </div>
</div>

<!-- 逐章导航栏 -->
<div class="mdx-chapter-nav mdx-backdrop-blurs">
    <!-- 上一章 -->
    <div class="mdx-chapter-nav-prev">
        <svg height="15px" style="position: absolute; top: 18px; left: 10px; cursor: pointer;" width="10px">
            <use class="mdx-button-ico-light" xlink:href="#icoPrevChapter"></use>
            prev
        </svg>
        <div class="mdx-chapter-nav-prev-text"></div>
    </div>
    <!-- 当前章节 -->
    <div class="mdx-chapter-nav-current"></div>
    <!-- 下一章 -->
    <div class="mdx-chapter-nav-next">
        <div class="mdx-chapter-nav-next-text">next</div>
        <svg height="15px" style="position: absolute; top: 18px; right: 10px; cursor: pointer;" width="10px">
            <use class="mdx-button-ico-light" xlink:href="#icoNextChapter"></use>
            next
        </svg>
    </div>
</div>

<!-- 插图导航 -->
<div class="mdx-figure-nav mdx-backdrop-blurs">
    <div class="mdx-figure-content"></div>
    <div class="mdx-figure-page-num"></div>
    <div class="mdx-btn-figure-nav mdx-btn-figure-prev">
        <svg width="12px" height="54px">
            <use class="mdx-button-ico-dark" xlink:href="#icoPrevFig"></use>
        </svg>
    </div>
    <div class="mdx-btn-figure-nav mdx-btn-figure-next">
        <svg width="12px" height="54px">
            <use class="mdx-button-ico-dark" xlink:href="#icoNextFig"></use>
        </svg>
    </div>
    <div class="mdx-btn-close-figure-viewer">
        <svg width="16px" height="16px">
            <use class="mdx-button-ico-light" xlink:href="#icoClose"></use>
        </svg>
    </div>
    <div class="mdx-copyright">
        <svg width="24px" height="24px" style="display: inline-block; vertical-align: middle;">
            <use xlink:href="#icoVLOOK-dark"></use>
        </svg>&nbsp;&nbsp;
        <a href="https://github.com/MadMaxChow/VLOOK" target="_blank"><strong>VLOOK™</strong></a> (V9.19) for
        <a href="https://www.typora.io" target="_blank">Typora</a>. Powered by <strong><a
                href="mailto:67870144@qq.com">MAX丨孟兆</a></strong>
    </div>
</div>

<!-- 页面工具栏 -->
<div class="mdx-toolbar mdx-backdrop-blurs">
    <!-- 大纲按钮 -->
    <div class="mdx-btn mdx-btn-outline">
        <svg width="20px" height="14px">
            <use class="mdx-button-ico-light" xlink:href="#icoOutline"></use>
        </svg>
    </div>
    <!-- 启动插图导航 -->
    <div class="mdx-btn mdx-btn-figure-viewer">
        <svg width="20px" height="18px">
            <use class="mdx-button-ico-light" xlink:href="#icoFigure"></use>
        </svg>
    </div>
    <!-- 打印 -->
    <div class="mdx-btn mdx-btn-print">
        <svg width="20px" height="19px">
            <use class="mdx-button-ico-light" xlink:href="#icoPrint"></use>
        </svg>
    </div>
    <!-- 开关聚光灯 -->
    <div class="mdx-btn mdx-btn-spotlight">
        <svg width="20px" height="20px">
            <use class="mdx-button-ico-light" xlink:href="#icoSpotlight"></use>
        </svg>
    </div>
    <!-- 字体风格 -->
    <div class="mdx-btn mdx-btn-font-style">
        <svg width="16px" height="18px">
            <use class="mdx-button-ico-light" xlink:href="#icoSerifFont"></use>
        </svg>
    </div>
    <!-- Light/Dark模式切换 -->
    <div class="mdx-btn mdx-btn-color-scheme">
        <svg width="20px" height="20px">
            <use class="mdx-button-ico-light" xlink:href="#icoLightMode"></use>
        </svg>
    </div>
</div>

<!-- 脚注弹层 -->
<div class="mdx-footer-note-panel">
    <div class="mdx-footer-note-panel-content"></div>
    <div class="mdx-footer-note-panel-header"></div>
    <div class="mdx-footer-note-panel-all">
        <a>查看所有脚注 ▶</a></div>
    <a name="xFooterArea"></a>
</div>

<!-- 在新标签打开的按钮 -->
<div class="mdx-btn mdx-btn-open-in-new-tab">
    <svg width="20px" height="18px">
        <use class="mdx-button-ico-light" xlink:href="#icoNewTab"></use>
    </svg>
</div>

<!-- 复制代码块内容的按钮 -->
<div class="mdx-btn mdx-btn-copy-code-block">
    <svg width="18px" height="18px">
        <use class="mdx-button-ico-light" xlink:href="#icoCopyCodeBlock"></use>
    </svg>
</div>

<!-- 聚光灯 -->
<div class="mdx-spotlight"></div>

<!-- 提示信息 -->
<div class="mdx-tool-tips mdx-backdrop-blurs"></div>
<div class="mdx-info-tips mdx-float-card mdx-backdrop-blurs"></div>

<!-- 表格十字光柱 -->
<div data-vk-direction="left" class="mdx-table-cross mdx-table-cross-left">&nbsp;</div>
<div data-vk-direction="right" class="mdx-table-cross mdx-table-cross-right">&nbsp;</div>
<div data-vk-direction="up" class="mdx-table-cross mdx-table-cross-up">&nbsp;</div>
<div data-vk-direction="down" class="mdx-table-cross mdx-table-cross-down">&nbsp;</div>

<!-- 内容展开操作区 -->
<div class="mdx-content-expander">
    <div class="mdx-btn">
        <span></span>
        <svg width="20px" height="20px">
            <use class="mdx-button-ico-light" xlink:href="#icoExtend"></use>
        </svg>
    </div>
</div>

<!-- 统计数据上报中转页面 -->
<iframe name="vlook-stat-gitee" style="display: block;" marginwidth="0" marginheight="0" frameBorder="0" scrolling="no" width="100%" height="0">
</iframe>

<!-- ==================== VLOOK Module ==================== -->
<script type="text/javascript">
    // 初始化计时器
    let iStopwatch = new Stopwatch(),
    // UI 元素
        iToolbar = undefined,
        iOutlineNav = undefined,
        iChapterNav = undefined,
        iParagraphNav = undefined,
        iSpotlight = undefined,
        iFontStyler = undefined,
        iFigureViewer = undefined,
        iWelcomeScreen = undefined,
        iToolTips = undefined,
        iInfoTips = undefined,
        iMask = undefined,
        iFootNote = undefined,
        iContentFolding = undefined;


    // ==================== 文档关键对象 ==================== //

    function Dom() {}

    Dom._body = undefined;
    Dom._write = undefined;

    Dom.body = function () {
        if (Dom._body === undefined) {
            Dom._body = $("body");
            if (Dom._body.length === 0)
                alert("Instantiation failed [ Dom.body ]");
        }
        return Dom._body;
    }

    Dom.write = function () {
        if (Dom._write === undefined) {
            Dom._write = $("#write");
            if (Dom._write.length === 0)
                alert("Instantiation failed [ Dom.write ]");
        }
        return Dom._write;
    }

    // ==================== 通用方法 ==================== //

    /**
     * 检查是否为空对象
     */
    $.prototype.isEmpty = function () {
        return (typeof (this) == "undefined");
    }

    /**
     * 判断对象是否为可视
     */
    $.prototype.isVisible = function () {
        return this !== undefined && this.css("visibility") === "visible";
    }

    /**
     * 判断对象是否已显示
     */
    $.prototype.isHidden = function () {
        return this !== undefined && this.css("display") === "none";
    }

    /**
     * 替换所有内容
     */
    String.prototype.replaceAll = function (f, e) {
        const reg = new RegExp(f, "g");
        return this.replace(reg, e);
    };

    /**
     * 以指定字符开始
     */
    String.prototype.startWith = function (s) {
        if (s == null || s === "" || this.length === 0 || s.length > this.length)
            return false;
        return this.substr(0, s.length) === s;
    };

    /**
     * 以指定字符结束
     */
    String.prototype.endWith = function (s) {
        if (s == null || s === "" || this.length === 0 || s.length > this.length)
            return false;
        return this.substring(this.length - s.length) === s;
    };

    /**
     * 环境信息类
     */
    const env = {
        /*
        Windows 平台样例：
            - (Chrome) Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36
            - (Firefox) Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:69.0) Gecko/20100101 Firefox/69.0
            - (Edge) Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.18362

        macOS 平台样例：
            - (Chrome) Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36
            - (Firefox) Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:69.0) Gecko/20100101 Firefox/69.0
            - (Safari) Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.2 Safari/605.1.15
        */

        // 浏览器内核信息
        core: function () {
            const u = navigator.userAgent;
            return {
                trident: u.indexOf("Trident") > -1, //IE内核
                presto: u.indexOf("Presto") > -1, //opera内核
                webkit: u.indexOf("AppleWebKit") > -1, //苹果、谷歌内核
                gecko: u.indexOf("Gecko") > -1 && u.indexOf("KHTML") === -1 //火狐内核
            };
        }(),
        // 设备信息
        device: function () {
            const u = navigator.userAgent;
            return {
                mobile: !!u.match(/AppleWebKit.*Mobile.*/), // 是否为移动终端
                iOS: !!u.match(/iphone os/i), // iOS 类终端
                android: u.indexOf("Android") > -1 || u.indexOf("Linux") > -1, // android 终端或者 UC 浏览器
                iPhone: u.indexOf("iPhone") > -1, // 是否为 iPhone 或者 QQHD 浏览器
                iPad: u.indexOf("iPad") > -1 // 是否 iPad
            };
        }(),
        // 浏览器类型
        browser: function () {
            const u = navigator.userAgent;
            return {
                Chrome: u.indexOf("Chrome") > -1, // Chrome 浏览器
                Firefox: u.indexOf("Firefox") > -1, // Firefox 浏览器
                Safari: u.indexOf("Safari") > -1 && u.indexOf("Version") > -1, // Safari 浏览器
                Edge: u.indexOf(" Edg/") > -1 // Edge 浏览器
            };
        }(),
        // 浏览器版本信息
        browserVersion: function () {
            const u = navigator.userAgent;
            return {
                Chrome: u.match(/Chrome\/[\d.]+/gi) ? u.match(/Chrome\/[\d.]+/gi)[0].match(/[\d]+/)[0] : "0", // chrome浏览器版本
                Firefox: u.match(/Firefox\/[\d.]+/gi) ? u.match(/Firefox\/[\d.]+/gi)[0].match(/[\d]+/)[0] : "0", // firefox浏览器版本
                Safari: u.match(/Version\/[\d.]+.+Safari\/[\d.]+/gi) ? u.match(/Version\/[\d.]+.+Safari\/[\d.]+/gi)[0].match(/[\d]+/)[0] : "0", // safari浏览器版本
                Edge: u.match(/Edg\/[\d.]+/gi) ? u.match(/Edg\/[\d.]+/gi)[0].match(/[\d]+/)[0] : "0" // chrome浏览器版本
            };
        }(),
        // 操作系统信息
        os: function () {
            const u = navigator.userAgent;
            return {
                Windows: /windows|win32|win64/i.test(u), // 是否为 Windows 平台
                macOS: /macintosh/i.test(u), // 是否为 macOS 平台
                iOS: /iphone os/i.test(u),  // 是否为 iOS 平台
                Linux: /linux/i.test(u)  // 是否为 iOS 平台
            };
        }(),
        // 语言信息
        language: function () {
            const lang = navigator.language;
            return {
                full: lang.toLowerCase(),
                base: lang.substring(0, 2),
                subset: lang.substring(3, lang.length)
            };
        }(),
        // 显示信息
        display: function () {
            return {
                DPR: window.devicePixelRatio
            };
        }(),
        // 打开环境信息
        print: function () {
            console.info("=== Environmental Information ===");
            console.info("User-Agent:\n" + navigator.userAgent);

            console.info("- Language\t\t" +
                "[ " + env.language.base + (env.language.subset.length > 0 ? "_" + env.language.subset : "") + " ]");

            console.info("- Device\t\t" +
                "[ " +
                (env.device.mobile ? "Mobile" : "") +
                (env.device.iOS ? "/iOS" : "") +
                (env.device.android ? "/Android" : "") +
                (env.device.iPhone ? "/iPhone" : "") +
                (env.device.iPad ? "/iPad" : "") +
                "]");

            console.info("- OS\t\t\t" +
                (env.os.macOS ? "[ macOS ]"
                    : (env.os.Windows ? "[ Windows ]"
                        : (env.os.iOS ? "[ iOS ]"
                            : (env.os.Linux ? "[Linux]" : "[Others]")))));

            console.info("- Browser\t\t" +
                "[ " +
                (env.browser.Chrome ? "Chrome / " + env.browserVersion.Chrome : "") +
                (env.browser.Firefox ? "Firefox / " + env.browserVersion.Firefox : "") +
                (env.browser.Safari ? "Safari / " + env.browserVersion.Safari : "") +
                (env.browser.Edge ? "Edge / " + env.browserVersion.Edge : "") +
                " ]");

            console.info("- Core\t\t\t" +
                "[ " +
                (env.core.gecko ? "Gecko" : "") +
                (env.core.presto ? "Presto" : "") +
                (env.core.trident ? "Trident" : "") +
                (env.core.webkit ? "WebKit" : "") +
                " ]");

            console.info("- DPR\t\t\t" +
                "[ " +
                env.display.DPR +
                " ]");
            console.info("  (Device Pixel Ratio)")
        }
    };

    // ==================== VLOOK 关键信息类 ==================== //

    function VLOOK() {}

    // 版本信息
    VLOOK.version = 'V9.19';

    // 是否为开发调试模式
    VLOOK.debugMode = false;

    /**
     * 在 debug 模式下输出调试信息
     */
    VLOOK.debug = function (...info) {
        if (VLOOK.debugMode === true)
            console.warn(...info);
    }

    /**
     * 检查文档结构是否符合 VLOOK 规范程度
     */
    VLOOK.checkSpecification = function () {
        let passed = true,
            missContent = [
                "因以下原因无法激活 VLOOK 插件：\n\n",
                "因以下原因無法激活 VLOOK 插件：\n\n",
                "The VLOOK plugin cannot be activated for the following reasons:\n\n",
                "Le plugin VLOOK ne peut pas être activé pour les raisons suivantes:\n\n",
                "Плагин VLOOK не может быть активирован по следующим причинам:\n\n",
                "次の理由により、VLOOKプラグインをアクティブ化できません：\n\n",
                "다음과 같은 이유로 VLOOK 플러그인을 활성화 할 수 없습니다:\n\n"
                ][VLOOK.lang.id];

        // 只支持由 Typora 导出的 HTML 文件
        if (Dom.body().attr("class").indexOf("typora-export") === -1) {
            missContent += [
                "• 只支持由 Typora 导出的 HTML 文件\n",
                "• 只支持由 Typora 導出的 HTML 文件\n",
                "• Only HTML files exported by Typora are supported\n",
                "• Seuls les fichiers HTML exportés par Typora sont pris en charge\n",
                "• Поддерживаются только файлы HTML, экспортированные Typora\n",
                "• Typora によってエクスポートされたHTMLファイルのみがサポートされています\n",
                "• Typora 에서 내 보낸 HTML 파일 만 지원됩니다\n"
                ][VLOOK.lang.id];
            passed = false;
        }

        // 缺少封面
        if ($("#write > h6:first-child").length === 0) {
            missContent += [
                "• 缺少符合 VLOOK 规范的「封面」内容\n",
                "• 缺少符合 VLOOK 規範的「封面」內容\n",
                "• Missing \"Cover\" content that meets VLOOK specifications\n",
                "• Contenu de \"Couverture\" manquant conforme aux spécifications VLOOK\n",
                "• Отсутствует содержание \"обложки\", соответствующее спецификациям VLOOK\n",
                "• VLOOK 仕様を満たす「カバー」コンテンツがありません\n",
                "• VVLOOK 사양을 충족하는 \"커버\" 컨텐츠가 없습니다\n"
                ][VLOOK.lang.id];
            passed = false;
        }

        // 缺少目录
        if ($(".md-toc").length === 0) {
            missContent += [
                "• 缺少 GFM 标准的「目录」\n",
                "• 缺少 GFM 標準的「目錄」\n",
                "• Missing GFM standard \"Table of Content\"\n",
                "• Norme GFM manquante \"Table des matières\"\n",
                "• Отсутствует стандарт GFM \"Оглавление\"\n",
                "• GFM 標準「カタログ」がありません\n",
                "• 누락 된 GFM 표준 \"카탈로그\"\n"
                ][VLOOK.lang.id];
        }

        // 缺少封底
        if ($(".footnotes-area").length === 0) {
            if ($("#write > h6:last-child").length === 0) {
                missContent += [
                    "• 缺少符合 VLOOK 规范的「封底」内容\n",
                    "• 缺少符合 VLOOK 規範的「封底」內容\n",
                    "• Missing \"Back cover\" content that meets VLOOK specifications\n",
                    "• Contenu manquant \"Couverture arrière\" conforme aux spécifications VLOOK\n",
                    "• Отсутствует содержимое \"задней обложки\", которое соответствует спецификациям VLOOK\n",
                    "• VLOOK 仕様を満たす「裏表紙」のコンテンツがありません\n",
                    "• VLOOK 사양을 충족하는 \"뒷 표지\" 내용이 없습니다\n"
                    ][VLOOK.lang.id];
                passed = false;
            }
        }
        else {
            if ($("#write > h6:nth-last-child(2)").length === 0) {
                missContent += [
                    "• 缺少符合 VLOOK 规范的「封底」内容\n",
                    "• 缺少符合 VLOOK 規範的「封底」內容\n",
                    "• Missing \"Back cover\" content that meets VLOOK specifications\n",
                    "• Contenu manquant \"Couverture arrière\" conforme aux spécifications VLOOK\n",
                    "• Отсутствует содержимое \"задней обложки\", которое соответствует спецификациям VLOOK\n",
                    "• VLOOK仕様を満たす「裏表紙」のコンテンツがありません\n",
                    "• VLOOK 사양을 충족하는 \"뒷 표지\" 내용이 없습니다\n"
                    ][VLOOK.lang.id];
                passed = false;
            }
        }
        
        // 存在不符合规范的情况
        if (passed === false) {
            alert(missContent);
            return false;
        }

        return true;
    }

    /**
     * 初始化关键组件实例
     */
    VLOOK.initIntance = function (newTab) {
        VLOOK.doc.newTab = newTab;

        // ==================== UI --------------------

        // 欢迎屏
        iWelcomeScreen = new WelcomeScreen();
        if (iWelcomeScreen === false)
            alert("Instantiation failed [ iWelcomeScreen ]");

        // 聚光灯
        iSpotlight = new Spotlight(180);
        if (iSpotlight === false)
            alert("Instantiation failed [ iSpotlight ]");

        iContentFolding = new ContentFolding();
        if (iContentFolding.length === 0)
            alert("Instantiation failed [ iContentFolding ]");

        // 大纲导航
        iOutlineNav = new OutlineNav(new BackgroundMask());
        if (iOutlineNav === false)
            alert("Instantiation failed [ iOutlineNav ]");

        // 逐章导航
        iChapterNav = new ChapterNav(iOutlineNav);
        if (iChapterNav === false)
            alert("Instantiation failed [ iChapterNav ]");
        else {
            // 上一章：绑定鼠标事件
            iChapterNav.prev.ui.unbind("click").click(function () {
                iOutlineNav.gotoHeader(iChapterNav.prev.text);
            });
            // hover 事件处理
            iChapterNav.prev.ui.hover(function () {
                iToolTips.show($(this), "auto");
            }, function () {
                iToolTips.hide();
            });

            // 当前章节：绑定鼠标事件
            iChapterNav.current.ui.unbind("click").click(function () {
                iOutlineNav.gotoHeader(iChapterNav.current.ui);
            });
            // hover 事件处理
            iChapterNav.current.ui.hover(function () {
                iToolTips.show($(this), "center");
            }, function () {
                iToolTips.hide();
            });

            // 下一章：绑定鼠标事件
            iChapterNav.next.ui.unbind("click").click(function () {
                iOutlineNav.gotoHeader(iChapterNav.next.text);
            });
            // hover 事件处理
            iChapterNav.next.ui.hover(function () {
                iToolTips.show($(this), "right");
            }, function () {
                iToolTips.hide();
            });

            // 添加关联组件
            iOutlineNav.chapterNav = iChapterNav;
        }

        // 工具栏
        iToolbar = new Toolbar(iOutlineNav, iChapterNav);
        if (iToolbar === false)
            alert("Instantiation failed [ iToolbar ]");
        else {
            // 大纲按钮
            iToolbar.add("outline", $(".mdx-btn-outline"));
            iToolbar.buttons["outline"].unbind("click").click(function () {
                iToolTips.hide();
                iOutlineNav.toggle();
            });
            // hover 事件处理
            iToolbar.buttons["outline"].hover(function () {
                iToolTips.show($(this), "auto");
            }, function () {
                iToolTips.hide();
            });

            // 插图导航按钮
            iToolbar.add("figure-viewer", $(".mdx-btn-figure-viewer"));
            iToolbar.buttons["figure-viewer"].unbind("click").click(function () {
                iToolTips.hide();
                iFigureViewer.show(null);
            });
            // hover 事件处理
            iToolbar.buttons["figure-viewer"].hover(function () {
                iToolTips.show($(this), "auto");
            }, function () {
                iToolTips.hide();
            });

            // 颜色方案（Light/Dark）
            iToolbar.add("color-scheme", $(".mdx-btn-color-scheme"));
            iToolbar.buttons["color-scheme"].unbind("click").click(function () {
                iToolTips.hide();
                ColorScheme.toggle();
                // ColorScheme.afterToggle();
            });
            iToolbar.buttons["color-scheme"].hover(function () {
                iToolTips.show($(this), "auto");
            }, function () {
                iToolTips.hide();
            });

            // 字体风格
            iToolbar.add("font-style", $(".mdx-btn-font-style"));
            iToolbar.buttons["font-style"].unbind("click").click(function () {
                iToolTips.hide();
                iFontStyler.toggle();
            });
            // hover 事件处理
            iToolbar.buttons["font-style"].hover(function () {
                iToolTips.show($(this), "auto");
            }, function () {
                iToolTips.hide();
            });

            // 聚光灯
            iToolbar.add("spotlight", $(".mdx-btn-spotlight"));
            iToolbar.buttons["spotlight"].unbind("click").click(function () {
                iToolTips.hide();
                iSpotlight.toggle();
            });
            iToolbar.buttons["spotlight"].hover(function () {
                iToolTips.show($(this), "auto");
            }, function () {
                iToolTips.hide();
            });

            // 打印按钮
            iToolbar.add("print", $(".mdx-btn-print"));
            iToolbar.buttons["print"].unbind("click").click(function () {
                iToolTips.hide();
                VLOOK.print.preprocess();
            });
            // hover 事件处理
            iToolbar.buttons["print"].hover(function () {
                iToolTips.show($(this), "auto");
            }, function () {
                iToolTips.hide();
            });

            // 添加关联组件
            iOutlineNav.toolbar = iToolbar;
        }

        iFontStyler = new FontStyler(iToolbar.buttons["font-style"], new BackgroundMask());
        if (iFontStyler === false)
            alert("Instantiation failed [ iFontStyler ]");

        iFigureViewer = new FigureNav();
        if (iFigureViewer === false)
            alert("Instantiation failed [ iFigureViewer ]");

        iToolTips = new ToolTips();
        if (iToolTips.length === 0)
            alert("Instantiation failed [ iToolTips ]");

        iInfoTips = new InfoTips(new BackgroundMask());
        if (iInfoTips.length === 0)
            alert("Instantiation failed [ iInfoTips ]");

        iMask = $(".mdx-mask");
        if (iMask.length === 0)
            alert("Instantiation failed [ iMask ]");

        // 脚注
        iFootNote = new FootNote(new BackgroundMask());
        if (iFootNote === false)
            alert("Instantiation failed [ iFootNote ]");
    }

    /**
     * 初始化 VLOOK
     *
     * @param colorScheme 指定默认的颜色方案 light/dark
     */
    VLOOK.initKernel = function (colorScheme) {
        // 锁定滚动
        VLOOK.doc.scroll.freeze();

        // ----------------------------------------
        // 加载本文档专属图标
        iStopwatch.lapStart();
        console.info("- Document Logo");
        let docIcon = $(".mdx-doc-logo").css("background-image");
        if (docIcon !== undefined)
            $($("head")[0]).append("<link rel='icon' href='" + docIcon.substring(5, docIcon.length - 2) +
                "' type='image/x-icon'/>");
        iStopwatch.lapStop();

        // ----------------------------------------
        // 初始化字体风格
        iStopwatch.lapStart();
        console.info("- Font Style");
        // 清空历史存储
        if (VLOOK.util.parseQueryString(window.location.href)["reset"] === "ls") {
            console.warn("!!! Reset Local Storage !!!");
            localStorage.removeItem("VLOOK-" + VLOOK.version + "-hint-for-green-hand-step-bf");
            localStorage.removeItem("VLOOK-" + VLOOK.version + "-font-style");
        }
        // 若手动切换过字体风格，则恢复为上次设置字体风格
        const style = localStorage["VLOOK-" + VLOOK.version + "-font-style"];
        iFontStyler.style = getComputedStyle(document.documentElement).getPropertyValue(
            "--vlook-default-font-style").trim();
        if (window.localStorage && style !== undefined) {
            console.warn("    Last Setting: " + style);
            iFontStyler.apply(style);
        }else {
            console.info("    Default: " + iFontStyler.style);
            iFontStyler.apply();
        }
        iStopwatch.lapStop();

        // ----------------------------------------
        // 初始化国际化 UI
        iStopwatch.lapStart();
        console.info("- UI i18n");
        VLOOK.ui.initI18n();
        iStopwatch.lapStop();

        // ----------------------------------------
        // 在新标签中初始化时不处理
        console.info("- Check Inner Bad Link");
        iStopwatch.lapStart();
        if (VLOOK.doc.newTab === false) {
            // 检查页内链接坏链
            VLOOK.doc.link.checkInner();
        }
        iStopwatch.lapStop();

        // ----------------------------------------
        // 检查重复的Header
        iStopwatch.lapStart();
        console.info("- Check Duplicate Header");
        VLOOK.doc.checkDuplicateHeader();
        iStopwatch.lapStop();

        // ----------------------------------------
        // 初始化音频数据
        iStopwatch.lapStart();
        console.info("- Audio ");
        ExtAudio.init();
        iStopwatch.lapStop();

        // ----------------------------------------
        // 初始化视频数据
        iStopwatch.lapStart();
        console.info("- Video ");
        ExtVideo.init();
        iStopwatch.lapStop();

        // ----------------------------------------
        // 初始化插图数据
        iStopwatch.lapStart();
        console.info("- Figure ");
        ExtFigure.init();
        iStopwatch.lapStop();

        // ----------------------------------------
        // 初始化表格
        iStopwatch.lapStart();
        console.info("- Table");
        ExtTable.init();
        iStopwatch.lapStop();

        // ----------------------------------------
        // 初始化引用块
        iStopwatch.lapStart();
        console.info("- Quote");
        ExtQuote.init();
        iStopwatch.lapStop();

        // ----------------------------------------
        // 初始化代码块
        iStopwatch.lapStart();
        console.info("- Code Block");
        ExtCodeBlock.init();
        iStopwatch.lapStop();

        // ----------------------------------------
        iStopwatch.lapStart();
        console.info("- Restyle Code / Fences");
        // 重置行内代码code样式
        ColorTag.init();
        // 重置多行代码块code block样式
        // ColorTag.initForCodeBlock();
        iStopwatch.lapStop();

        // ----------------------------------------
        // 重置任务列表样式
        iStopwatch.lapStart();
        console.info("- Task List Checkbox");
        Restyler.forTaskListCheckbox();
        iStopwatch.lapStop();

        // ----------------------------------------
        // 初始化逐段导航
        iStopwatch.lapStart();
        console.info("- Paragraph Nav");
        ParagraphNav.init();
        iStopwatch.lapStop();

        // ----------------------------------------
        // 增强脚注
        iStopwatch.lapStart();
        console.info("- Footer Note");
        // initFootNote();
        FootNote.init();
        iStopwatch.lapStop();

        // ----------------------------------------
        // 初始化外部链接
        iStopwatch.lapStart();
        console.info("- External Link");
        VLOOK.doc.link.adjustExternal();
        iStopwatch.lapStop();

        // ----------------------------------------
        // 初始化Outline数据
        console.info("- Outline & Chapter Nav");
        iStopwatch.lapStart();
        if (OutlineNav.init()) {
            // 更新工具栏标题
            iOutlineNav.title.text($(document).attr("title"));

            // 自适应页面内容显示
            iOutlineNav.focusHeader();

            iOutlineNav.adjust();
            // iContentFolding.adjust();
            iChapterNav.adjust();
            iToolbar.adjust();
        }
        iStopwatch.lapStop();

        // ----------------------------------------
        // 初始化全局热键
        iStopwatch.lapStart();
        console.info("- Hotkey");
        VLOOK.ui.initHotkey();
        iStopwatch.lapStop();

        // ----------------------------------------
        // 根据设备类型自适应hover样式
        iStopwatch.lapStart();
        console.info("- Adjust for Mobile");
        VLOOK.ui.adjustHoverStyle();
        // 隐藏插图动作按钮
        ContentAssist.hideButtons();
        iStopwatch.lapStop();

        // ----------------------------------------
        console.info("- Binding Event");
        iStopwatch.lapStart();
        // 绑定文档鼠标移动事件，聚光灯跟随鼠标移动
        document.addEventListener("mousemove", function () {
            iSpotlight.repaint(event || window.event);
        });

        // 绑定文档的单击事件
        $(document).unbind("click").click(function () {
            if (ExtTable.lastCrossTable !== undefined)
                ExtTable.hideCellCross(true);
        });

        // 绑定文档的滚动事件
        $(document).scroll(function () {
            let currentTime = new Date().getTime(),
                scrollTop = $(document).scrollTop();
            // ----------------------------------------
            // 控制执行频率，避免处理过快影响性能
            if (scrollTop < 100
                || currentTime - VLOOK.doc.scroll.lastUpdateTime > 2000
                || (Math.abs(scrollTop - VLOOK.doc.scroll.lastTop) > 100 && (currentTime - VLOOK.doc.scroll.lastUpdateTime) > 1000)) {
                VLOOK.doc.scroll.lastUpdateTime = currentTime;
                VLOOK.doc.scroll.lastTop = $(document).scrollTop();

                VLOOK.ui.adjustAll();
            }

            // 由于涉及到章节导航栏数据更新等不同逻辑处理，执行频率由 focusHeader 内进行控制
            iOutlineNav.focusHeader();
        });

        // 绑定窗口大小缩放事件
        $(window).resize(function () {
            iOutlineNav.focusHeader();

            iOutlineNav.adjust();
            iContentFolding.adjust();
            iChapterNav.adjust();
            iToolbar.adjust();
        });

        // 绑定打印前的触发事件
        window.onbeforeprint = function () {};
        // 绑定打印后的触发事件
        window.onafterprint = function () {
            VLOOK.print.postProcess();
        };

        iStopwatch.lapStop();

        // 应用于在新标签中打开内容时初始化颜色模式
        if (colorScheme != null)
            ColorScheme.scheme = colorScheme;
    }

    // VLOOK UI
    VLOOK.ui = {
        effect : 0, // 0/1/2/3 启用的特效特级，0: 无特效

        /**
         * 判断是否为小屏
         */
        isSmallScreen : function () {
            // alert($(window).width());
            return $(window).width() <= 1024;
        },

        /**
         * 初始 UI 国际化
         */
        initI18n : function () {
            VLOOK.lang.init();

            iOutlineNav.title.attr("title", [
                "回到封面",
                "回到封面",
                "Back to cover",
                "Retour à la couverture",
                "Вернуться к обложке",
                "カバーに戻る",
                "커버로 돌아 가기"
            ][VLOOK.lang.id]);

            iContentFolding.ui.find("div > span").attr("title", [
                "查看更多",
                "查看更多",
                "View More",
                "Voir Plus",
                "Посмотреть ещё",
                "もっと見る",
                "더보기"
            ][VLOOK.lang.id]);

            iToolbar.buttons["outline"].attr("data-vk-tips", [
                "<kbd>O</kbd> <strong>隐藏</strong> / <strong>显示</strong> 大纲面板",
                "<kbd>O</kbd> <strong>隱藏</strong> / <strong>顯示</strong> 大綱面板",
                "<kbd>O</kbd> <strong>Hide</strong> / <strong>Show</strong> Outline Panel",
                "<kbd>O</kbd> <strong>Cacher</strong> / <strong>Afficher</strong> le panneau de contour",
                "<kbd>O</kbd> <strong>Скрыть</strong> / <strong>показать</strong> панель",
                "<kbd>O</kbd> アウトラインパネルの <strong>非表示</strong> / <strong>表示</strong>",
                "<kbd>O</kbd> 개요 패널 <strong>숨기기</strong> / <strong>표시</strong>"
            ][VLOOK.lang.id]);

            iToolbar.buttons["figure-viewer"].attr("data-vk-tips", [
                "<kbd>I</kbd> 浏览插图",
                "<kbd>I</kbd> 查看文檔插圖",
                "<kbd>I</kbd> Browse figures",
                "<kbd>I</kbd> Parcourir la figures",
                "<kbd>I</kbd> Просмотрите цифры",
                "<kbd>I</kbd> 図を参照する",
                "<kbd>I</kbd> 그림 찾아보기"
            ][VLOOK.lang.id]);

            iToolbar.buttons["color-scheme"].attr("data-vk-tips", [
                "<kbd>D</kbd> 切换 [ <strong>黑暗</strong> / <strong>明亮</strong> ] 模式",
                "<kbd>D</kbd> 切換 [ <strong>黑暗</strong> / <strong>明亮</strong> ] 模式",
                "<kbd>D</kbd> Switch <strong>Dark</strong> / <strong>Light</strong> Mode",
                "<kbd>D</kbd> Basculer en mode <strong>sombre</strong> / <strong>clair</strong>",
                "<kbd>D</kbd> Переключить <strong>темный</strong> / <strong>светлый</strong> режим",
                "<kbd>D</kbd> <strong>ダーク</strong> / <strong>ライト</strong> モードの切り替え",
                "<kbd>D</kbd> <strong>다크</strong> / <strong>라이트</strong> 모드 전환"
            ][VLOOK.lang.id]);

            iToolbar.buttons["font-style"].attr("data-vk-tips", [
                "<kbd>A</kbd> 切换 字体风格",
                "<kbd>A</kbd> 切換 字體風格",
                "<kbd>A</kbd> Switch Font Style",
                "<kbd>A</kbd> Changer de style de police",
                "<kbd>A</kbd> Переключить стиль шрифта",
                "<kbd>A</kbd> フォントスタイルの切り替え",
                "<kbd>A</kbd> 글꼴 스타일 전환"
            ][VLOOK.lang.id]);

            iToolbar.buttons["spotlight"].attr("data-vk-tips", [
                "<kbd>S</kbd> <strong>打开</strong> / <strong>关闭</strong> 聚光灯<br><kbd>⇧ Shift</kbd> 打开聚光灯后调整大小",
                "<kbd>S</kbd> <strong>打開</strong> / <strong>關閉</strong> 聚光燈<br><kbd>⇧ Shift</kbd> 打開聚光燈後調整大小",
                "<kbd>S</kbd> Turn the spotlight <strong>ON</strong> / <strong>OFF</strong><br><kbd>⇧ Shift</kbd> Resize after turning on the spotlight",
                "<kbd>S</kbd> <strong>Allumer</strong> / <strong>éteindre</strong> le projecteur<br><kbd>⇧ Shift</kbd> Redimensionner après avoir allumé le projecteur",
                "<kbd>S</kbd> <strong>Включите</strong> / <strong>выключите</strong> прожектор<br><kbd>⇧ Shift</kbd> Изменить размер после включения прожектора",
                "<kbd>S</kbd> スポットライトをオンにする <strong>ON</strong> / <strong>OFF</strong><br><kbd>⇧ Shift</kbd> スポットライトをオンにした後のサイズ変更",
                "<kbd>S</kbd> 스포트라이트 <strong>켜기</strong> / <strong>끄기</strong><br><kbd>⇧ Shift</kbd> 스포트라이트를 켠 후 크기 조정"
            ][VLOOK.lang.id]);

            iToolbar.buttons["print"].attr("data-vk-tips", [
                "<kbd>P</kbd> 打印...",
                "<kbd>P</kbd> 打印...",
                "<kbd>P</kbd> Print...",
                "<kbd>P</kbd> Imprimer...",
                "<kbd>P</kbd> Печать...",
                "<kbd>P</kbd> 印刷する...",
                "<kbd>P</kbd> 인쇄..."
            ][VLOOK.lang.id]);

            iChapterNav.prev.ui.attr("data-vk-tips", [
                "<kbd>◀</kbd> / <kbd>&lt;</kbd> 前一章",
                "<kbd>◀</kbd> / <kbd>&lt;</kbd> 前一章",
                "<kbd>◀</kbd> / <kbd>&lt;</kbd> Previous Chapter",
                "<kbd>◀</kbd> / <kbd>&lt;</kbd> Chapitre Précédent",
                "<kbd>◀</kbd> / <kbd>&lt;</kbd> Предыдущая глава",
                "<kbd>◀</kbd> / <kbd>&lt;</kbd> 前の章",
                "<kbd>◀</kbd> / <kbd>&lt;</kbd> 이전 장"
            ][VLOOK.lang.id]);

            iChapterNav.next.ui.attr("data-vk-tips", [
                "<kbd>▶</kbd> / <kbd>&gt;</kbd> 后一章",
                "<kbd>▶</kbd> / <kbd>&gt;</kbd> 後一章",
                "<kbd>▶</kbd> / <kbd>&gt;</kbd> Next Chapter",
                "<kbd>▶</kbd> / <kbd>&gt;</kbd> Chapitre Suivant",
                "<kbd>▶</kbd> / <kbd>&gt;</kbd> Следующая глава",
                "<kbd>▶</kbd> / <kbd>&gt;</kbd> 次の章",
                "<kbd>▶</kbd> / <kbd>&gt;</kbd> 다음 장"
            ][VLOOK.lang.id]);

            iChapterNav.current.ui.attr("data-vk-tips", [
                "回到本章的开始",
                "回到本章的開始",
                "Go back to the beginning of this chapter",
                "Retourner au début de ce chapitre",
                "Вернитесь к началу этой главы",
                "この章の始めに戻る",
                "이 장의 시작 부분으로 돌아 가기"
            ][VLOOK.lang.id]);

            iFigureViewer.button.prev.attr("title", [
                "[ ← ] 前一张",
                "[ ← ] 前一張",
                "[ ← ] Previous",
                "[ ← ] Précédent",
                "[ ← ] Предыдущая фотографияs",
                "[ ← ] 前へ",
                "[ ← ] 이전"
            ][VLOOK.lang.id]);

            iFigureViewer.button.next.attr("title", [
                "[ → ] 后一张",
                "[ → ] 後一張",
                "[ → ] Next",
                "[ → ] Le suivant",
                "[ → ] Следующий",
                "[ → ] 次の",
                "[ → ] 다음"
            ][VLOOK.lang.id]);

            iFigureViewer.button.close.attr("title", [
                "[ ESC ] 关闭",
                "[ ESC ] 關閉",
                "[ ESC ] Close",
                "[ ESC ] Fermer",
                "[ ESC ] близко",
                "[ ESC ] 閉じる",
                "[ ESC ] 닫기"
            ][VLOOK.lang.id]);

            iFootNote.buttonSeeAll.children("a").text([
                "查看所有脚注 ▶",
                "查看所有腳註 ▶",
                "View all footnotes ▶",
                "Afficher toutes les notes de bas de page ▶",
                "Просмотреть все сноски ▶",
                "すべての脚注を見る ▶",
                "모든 각주보기 ▶"
            ][VLOOK.lang.id]);

            ContentAssist.button.openInNewTab.attr("title", [
                "在新标签页中打开",
                "在新標籤頁中打開",
                "Open in new tab",
                "Ouvrir dans un nouvel onglet",
                "Открыть в новой вкладке",
                "新しいタブで開く",
                "새 탭에서 열기"
            ][VLOOK.lang.id]);

            ContentAssist.button.copyCodeBlock.attr("title", [
                "复制全部代码",
                "複製全部代碼",
                "Copy all code",
                "Copiez tout le code",
                "Скопируйте весь код",
                "すべてのコードをコピー",
                "모든 코드 복사"
            ][VLOOK.lang.id]);
        },

        /**
         * 进行文档导航相关的 UI 元素的适配处理
         */
        adjustAll : function () {
            if (iOutlineNav.adjust() === true)
                iContentFolding.adjust();
            iToolbar.adjust();
            iChapterNav.adjust();
        },

        /**
         * 对象根据特效级别进行适配
         *
         * @param target 目标对象
         */
            adjustEffect : function (target) {
            if (VLOOK.ui.effect >= 1) {
                target.css({
                    "transition": "all " + VLOOK.animate.speed * 0.5 + "ms ease-in"
                });
            }
        },

        /**
         * 根据设备类型自适应hover样式
         */
        adjustHoverStyle : function () {
            // 移动设备时解绑样式事件
            if (env.device.mobile) {
                $(".mdx-btn").unbind("hover");
                // iChapterNav.prev.ui.unbind("hover");
                // iChapterNav.next.ui.unbind("hover");
                iChapterNav.adjustHoverStyle("mobile");
                iFigureViewer.adjustHoverStyle("mobile");
            }
            // 非移动设备时绑定样式事件
            else {
                // 所有常规按钮 hover 事件处理
                $(".mdx-btn").hover(function () {
                    $(this).addClass("mdx-btn-hover");
                }, function () {
                    $(this).removeClass("mdx-btn-hover");
                });

                iChapterNav.adjustHoverStyle("desktop");
                iFigureViewer.adjustHoverStyle("desktop");
            }
        },

        /**
         * 初始化特效处理
         */
        initEffect : function () {
            let transitionTarget = "a, a:active, .CodeMirror-line, .mdx-figure, .mdx-folder-ico, .MathJax_SVG, .MathJax_SVG_Display, .md-toc-item, .mdx-btn-load-screen-done, .mdx-blockquote-folder, .mdx-toc-panel-title, .mdx-btn, .mdx-chapter-nav-prev, .mdx-chapter-nav-current, .mdx-chapter-nav-next, .mdx-btn-figure-prev, .mdx-btn-figure-next, .mdx-btn-close-figure-viewer, .mdx-clickable-hover, .mdx-OINTable-hover";
            // 启用 normal 级特效
            // VLOOK.ui.enableAnimation = true;
            if (VLOOK.ui.effect === 1) {
                VLOOK.ui.adjustEffect($(transitionTarget));
                VLOOK.ui.adjustEffect($("#write, .mdx-toolbar, .mdx-chapter-nav, .mdx-toc-panel"));
                // $(transitionTarget).css({
                //     "transition": "all " + VLOOK.animate.speed + "ms ease-in"
                // });
                // $("#write, .mdx-toolbar, .mdx-chapter-nav, .mdx-toc-panel").css({
                //     "transition": "all " + VLOOK.animate.speed + "ms ease-in"
                // });
            }

            // 因 CSS 的 transition 不变动渐变背景过渡效果，须通过增/减不同的预置样式实现过渡效果
            if (VLOOK.ui.effect >= 1) {
                iChapterNav.prev.ui.addClass("mdx-chapter-nav-prev-effect");
                iChapterNav.current.ui.addClass("mdx-chapter-nav-current-effect");
                iChapterNav.next.ui.addClass("mdx-chapter-nav-next-effect");
            }
            else {
                iChapterNav.prev.ui.addClass("mdx-chapter-nav-prev-noeffect");
                iChapterNav.current.ui.addClass("mdx-chapter-nav-current-noeffect");
                iChapterNav.next.ui.addClass("mdx-chapter-nav-next-noeffect");
            }

            // 启用 good 级特效
            // VLOOK.ui.effect = "good";
            if (VLOOK.ui.effect === 2) {
                VLOOK.ui.adjustEffect($(transitionTarget));
                // $(transitionTarget).css({
                //     "transition": "all " + VLOOK.animate.speed + "ms ease-in"
                // });
            }

            // 启用 best 级特效
            // VLOOK.ui.effect = "best";
            if (VLOOK.ui.effect === 3) {
                // $(".mdx-mask").css({
                //     "background-color": "rgba(255, 255, 255, 0.9)"
                // });

                // $(".mdx-backdrop-blurs").css({
                //     "backdrop-filter": "blur(15px)",
                //     "-webkit-backdrop-filter": "blur(15px)"
                // });

                // $(".mdx-load-screen");
            }
        },

        /**
         * 初始化热键
         */
        initHotkey : function () {
            // 键盘按下事件
            $(document).keydown(function (event) {
                const code = event.keyCode || event.which || event.charCode;
                let combKeys = (event.ctrlKey ? "Ctrl _ " : "")
                    + (event.shiftKey ? "Shift _ " : "")
                    + (event.altKey ? "Alt _ " : "")
                    + (event.metaKey ? "Win/Cmd _ " : "");
                VLOOK.debug("Keydown: "
                    + combKeys
                    + String.fromCharCode(code)
                    + " [" + code + "]");
                // 按了组合键时忽略（除 Shift）
                if (event.ctrlKey || event.altKey || event.metaKey)
                    return;

                switch (code) {
                    case 74: // J
                        VLOOK.report.push(['Hotkey', combKeys, String.fromCharCode(code), 0]);
                        ExtTable.hideCellCross(true);
                        if (iParagraphNav.next(1)) // 步长1
                            ExtQuote.autoUnfold(); // 自动展开引用
                        break;
                    case 75: // K
                        VLOOK.report.push(['Hotkey', combKeys, String.fromCharCode(code), 0]);
                        ExtTable.hideCellCross(true);
                        if (iParagraphNav.prev(1)) // 步长1
                            ExtQuote.autoUnfold(); // 自动展开引用
                        break;
                    case 72: // H
                        VLOOK.report.push(['Hotkey', combKeys, String.fromCharCode(code), 0]);
                        ExtTable.hideCellCross(true);
                        if (iParagraphNav.prev(10)) // 步长10，快速移动
                            ExtQuote.autoUnfold(); // 自动展开引用
                        break;
                    case 76: // L
                        VLOOK.report.push(['Hotkey', combKeys, String.fromCharCode(code), 0]);
                        ExtTable.hideCellCross(true);
                        if (iParagraphNav.next(10)) // 步长10，快速移动
                            ExtQuote.autoUnfold(); // 自动展开引用
                        break;
                    case 188: // <
                    case 37: // ←
                        VLOOK.report.push(['Hotkey', combKeys, '<←', 0]);
                        if (iFigureViewer.ui.isHidden() === false)
                            iFigureViewer.prev();
                        else
                            iChapterNav.prev.ui.trigger("click");
                        break;
                    case 190: // >
                    case 39: // →
                        VLOOK.report.push(['Hotkey', combKeys, '>→', 0]);
                        if (iFigureViewer.ui.isHidden() === false)
                            iFigureViewer.next();
                        else
                            iChapterNav.next.ui.trigger("click");
                        break;
                    case 79: // O
                        VLOOK.report.push(['Hotkey', combKeys, String.fromCharCode(code), 0]);
                        if (iFigureViewer.ui.isHidden() === false)
                            return;
                        // toggleOutline();
                        iToolbar.buttons["outline"].trigger("click");
                        // iOutlineNav.toggle(afterToggleOutline);
                        break;
                    case 73: // I
                        VLOOK.report.push(['Hotkey', combKeys, String.fromCharCode(code), 0]);
                        // 文档无插图时不处理
                        if (iToolbar.buttons["figure-viewer"].isVisible() === false ||
                            iMask.isHidden() === false)
                            return;
                        // 以浮动样式显示时，先关闭大纲
                        if (iFigureViewer.ui.isHidden() === true)
                            iToolbar.buttons["figure-viewer"].trigger("click");
                        else
                            iFigureViewer.hide();
                        break;
                    case 68: // D
                        VLOOK.report.push(['Hotkey', combKeys, String.fromCharCode(code), 0]);
                        iToolbar.buttons["color-scheme"].trigger("click");
                        break;
                    case 65: // A
                        VLOOK.report.push(['Hotkey', combKeys, String.fromCharCode(code), 0]);
                        iToolbar.buttons["font-style"].trigger("click");
                        break;
                    case 80: // P
                        VLOOK.report.push(['Hotkey', combKeys, String.fromCharCode(code), 0]);
                        iFigureViewer.hide();
                        iFootNote.hide();
                        iToolbar.buttons["print"].trigger("click");
                        break;
                    case 83: // S
                        VLOOK.report.push(['Hotkey', combKeys, String.fromCharCode(code), 0]);
                        // iToolbar.buttons["spotlight"].trigger("click");
                        iToolTips.hide();
                        iSpotlight.toggle();
                        break;
                    case 16: // Shift
                        VLOOK.report.push(['Hotkey', combKeys, '', 0]);
                        iSpotlight.toggleZoom();
                        break;
                    case 13: // ENTER
                        VLOOK.report.push(['Hotkey', combKeys, 'ENTER', 0]);
                        // 关闭欢迎屏
                        if (iWelcomeScreen.finished === true)
                            iWelcomeScreen.close();
                        break;
                    case 27: // ESC
                        VLOOK.report.push(['Hotkey', combKeys, 'ESC', 0]);
                        iToolTips.hide();
                        iInfoTips.hide();

                        if (iOutlineNav.displayMode === "float")
                            iOutlineNav.hide();

                        iSpotlight.hide();
                        iFootNote.hide();
                        iFigureViewer.hide();

                        ExtTable.hideCellCross(true);
                        iParagraphNav.hide();
                        break;
                }
            });
        }

    } // VLOOK.ui

    // 语言类
    VLOOK.lang = {
        id : 2, // 0: 中（简），1: 中（繁），2: 英，3: 法，4: 俄，5: 日，6: 韩

        /**
         * 初始化语言
         */
        init : function () {
            switch (env.language.base) {
                case "zh":
                    VLOOK.lang.id = 1; // 中（繁）
                    if (env.language.subset.toLowerCase() === "cn" || env.language.subset.toLowerCase() === "chs")
                        VLOOK.lang.id = 0; // 中（简）
                    break;
                case "en":
                    VLOOK.lang.id = 2; // 英
                    break;
                case "fr":
                    VLOOK.lang.id = 3; // 法
                    break;
                case "ru":
                    VLOOK.lang.id = 4; // 俄
                    break;
                case "ja":
                    VLOOK.lang.id = 5; // 日
                    break;
                case "ko":
                    VLOOK.lang.id = 6; // 韩
                    break;
                default:
                    VLOOK.lang.id = 2; // 英
            }
        },
    } // VLOOK.lang

    // 动画类
    VLOOK.animate = {
        speed : 500, // 动画速度，值越小越快
        tension : 200, // 动画张力参数
        friction : 20, // 动画摩擦力参数
        tipsTimer : null, // 用于自动控制提示动画
    }

    // 文档类
    VLOOK.doc = {
        newTab : false, // 当前页面是通过 VLOOK 的在新标签打开功能生成的

        // 滚动信息
        scroll : {
            lastUpdateTime : 0, // 最后一次根据滚动变动更新 UI 的时间
            lastTop : 0, // 最后一次记录的滚动位置

            /**
             * 冻结文档滚动
             */
            freeze : function () {
                Dom.body().css({
                    // "user-select": "none", // 禁用网页选择
                    "overflow": "hidden" // 禁用网页滚动
                });
            },

            /**
             * 解冻文档滚动
             */
            unfreeze: function () {
                Dom.body().css({
                    // "user-select": "text", // 恢复网页选择
                    "overflow": "auto" // 恢复网页滚动
                });
            },
        },

        // 内容信息
        counter : {
            figure: 0, // 插图总数
            table: 0, // 表格总数
            codeBlock: 0, // 代码块总数
            audio: 0, // 音频总数
            video: 0, // 视频总数
        },

        // 图片加载失败后的默认填充图片（BASE64编码）
        defaultImage : "",

        /**
         * 检查重名的Header
         */
        checkDuplicateHeader : function () {
            let h = [];
            $(":header").each(function (i, n) {
                h.push($(this).text());
            });
            let dupHeaders = [];
            const ignoreHeaders = "业务规则,画图脚本,说明,通用的业务规则,用户界面与交互,通用的用户界面与交互,页面流程,业务主流程,流程图,状态图,数据接入";
            for (let i = 0, len = h.length; i < len; i++) {
                if (h.hasOwnProperty(i)) {
                    for (let k = 0, len = h.length; k < len; k++) {
                        if (h.hasOwnProperty(k)) {
                            if (i !== k && h[i] === h[k]
                                && ignoreHeaders.indexOf(h[k]) < 0)
                                dupHeaders.push(h[i]);
                        }
                    }
                }
            }
            // 输出警告信息
            for (let i = 0, len = dupHeaders.length; i < len; i++)
                console.warn([
                    "重名的标题 [",
                    "重複的標題 [",
                    "Duplicate Header [",
                    "Titre en double [",
                    "Дублирующее название [",
                    "重複するタイトル [",
                    "중복 제목 ["
                ][VLOOK.lang.id] + i + "]：" + dupHeaders[i]);
        },

        /**
         * 检查页内链接坏链
         */
        link : {
            checkInner: function () {
                let count = 0,
                    badLink = "";

                // 修复 Typora 内链 BUG
                RepairTool.fixTyporaInnerLink();

                // 检查所有页内链接对应的锚点是否都存在
                $("a[href^='#']").each(function () {
                    var href = $(this).attr("href");
                    // 忽略空链接，如 href="#"
                    if (href.length > 1) {
                        // 检索是否存在与该内链对应的锚点
                        let found = false,
                            aName = href.substring(1, href.length);
                        $("a[name='" + aName + "']").each(function () {
                            found = true;
                        });
                        // 没有检索到对应的锚点
                        if (found === false) {
                            count++;

                            badLink += [
                                "无效页内链接 [",
                                "無效頁內鏈接 [",
                                "Invalid Inner Link [",
                                "Lien de page non valide [",
                                "Недопустимая ссылка на страницу [",
                                "ページリンクが無効です[",
                                "잘못된 페이지 링크["
                            ][VLOOK.lang.id] + count + "]：" + $(this).text() + "[" + aName + "]\n" + $(this).parent().text() + "\n\n";

                            console.error([
                                "无效页内链接 [",
                                "無效頁內鏈接 [",
                                "Invalid Inner Link [",
                                "Lien de page non valide [",
                                "Недопустимая ссылка на страницу [",
                                "ページリンクが無効です [",
                                "잘못된 페이지 링크 ["
                            ][VLOOK.lang.id] + count + "]：" + $(this).text() + "[" + aName + "]\n" + $(this).parent().text() + "\n");
                        }
                    }
                });
                // 显示无效链接信息
                if (badLink.length > 0)
                    alert(badLink);
            },

            /**
             * 初始化外部链接（http://、https://、ftp://等），为其添加target参数
             */
            adjustExternal: function () {
                $("a[href^='http']").each(function () {
                    if (!$(this).attr("target"))
                        $(this).attr("target", "_blank");
                });
                $("a[href^='ftp']").each(function () {
                    if (!$(this).attr("target"))
                        $(this).attr("target", "_blank");
                });
            },
        },
    } // VLOOK.doc

    // 打印类
    VLOOK.print = {
        /**
         * 打印文档前处理
         */
        preprocess : function () {
            VLOOK.report.push(['Style', 'Print', '', 0]);

            // 若当前为 Dark 模式则强制临时切换为 Light 模式
            if (ColorScheme.scheme === "dark") {
                ColorScheme.schemeBeforePrint = ColorScheme.scheme;
                ColorScheme.scheme = "light";
                ColorScheme.apply();
            }

            // 将 mermaid 图表题注 width 等属性临时禁用，并调整为 100%，以适应打印纸张宽度
            $(".mdx-figure-caption-mermaid").each(function () {
                $(this).attr("before-print-width", $(this).css("width"));
                $(this).css("width", "100%");
            });
            
            // 将 mermaid 图表的 width, max-width 等属性临时禁用，并调整为 100%，以适应打印纸张宽度
            $(".mdx-figure-caption-mermaid svg").each(function () {
                if ($(this).attr("width") === "100%") {
                    // 针对流程图
                    if ($(this).attr("style").indexOf("max-width:") > -1) {
                        $(this).attr("before-print-max-width", $(this).css("max-width"));
                        $(this).css("max-width", "");
                    }
                    // 针对状态图
                    else if ($(this).attr("style").indexOf("width:") > -1) {
                        $(this).attr("before-print-width", $(this).css("width"));
                        $(this).css("width", "100%");
                    }
                } else { // 针对顺序图
                    $(this).attr("before-print-width", $(this).attr("width"));
                    $(this).css("width", "100%");
                }
            });

            // 移除引用块的展开提示
            $(".mdx-blockquote-folder[data-vk-folded=true]").each(function () {
                $(this).mouseup();
            });

            // 展开所有折叠的内容
            $("[data-vk-folded=true]").each(function () {
                $(this).attr("data-vk-before-print-folded", $(this).attr("data-vk-folded"));
                $(this).next().children(".mdx-btn").trigger("click");
            });

            window.print();
        },

        /**
         * 打印文档后处理
         */
        postProcess : function () {
            // 若打印前为 Dark 模式则先恢复为 Dark 模式
            if (ColorScheme.schemeBeforePrint === "dark") {
                ColorScheme.toggle();
            }

            // 恢复打印前的配置，详见 VLOOK.print.preprocess()
            $(".mdx-figure-caption-mermaid").each(function () {
                $(this).css("width", $(this).attr("before-print-width"));
                $(this).removeAttr("before-print-width");
            });
            //恢复打印前的配置，详见 VLOOK.print.preprocess()
            $(".mdx-figure-caption-mermaid svg").each(function () {
                if ($(this).attr("width") === "100%") {
                    // 针对流程图
                    if ($(this).attr("style").indexOf("max-width:") > -1) {
                        $(this).css("max-width", $(this).attr("before-print-max-width"));
                        $(this).removeAttr("before-print-max-width");
                    }
                    // 针对状态图
                    else if ($(this).attr("style").indexOf("width:") > -1) {
                        $(this).css("width", $(this).attr("before-print-width"));
                        $(this).removeAttr("before-print-width");
                    }
                } else { // 针对顺序图
                    $(this).css("width", $(this).attr("before-print-width"));
                    $(this).removeAttr("before-print-width");
                }
            });

            // 恢复打印前的配置，详见 VLOOK.print.preprocess()
            $("[data-vk-before-print-folded=true]").each(function () {
                let container = $(this);
                container.find("table, .mdx-figure, .md-fences").each(function () {
                    // if (container.attr("data-vk-before-print-folded") === "true")
                    iContentFolding.checkAndProcess($(this), false);
                    // foldingLongContent($(this), true);
                });
                container.removeAttr("data-vk-before-print-folded");
            });
        },
    } // VLOOK.print

    // 数据统计报告类
    VLOOK.report = {
        /**
         * 提交统计数据
         */
        submit : function (loadTimeCost) {
            // VLOOK 基本信息
            let statData = "?p=vlook"
                + "&ver=" + VLOOK.version
                + "&thm=" + getComputedStyle(document.documentElement)
                    .getPropertyValue("--vlook-theme-name").replaceAll("\"", "").trim();

            statData += "&d=" + (env.device.mobile ? "mob" : ""); // 设备类型
            statData += "&dpr=" + env.display.DPR; // DPR

            // OS 信息
            statData += "&os=";
            if (env.os.macOS)
                statData += "macOS";
            else if (env.os.Windows)
                statData += "Windows";
            else if (env.os.iOS)
                statData += "iPhone";
            else if (env.os.Linux)
                statData += "iPhone";
            else
                statData += "others";

            // 浏览器及版本
            statData += "&b=";
            if (env.browser.Edge)
                statData += "edge&bv=" + env.browserVersion.Edge;
            else if (env.browser.Chrome)
                statData += "chrome&bv=" + env.browserVersion.Chrome;
            else if (env.browser.Firefox)
                statData += "firefox&bv=" + env.browserVersion.Firefox;
            else if (env.browser.Safari)
                statData += "safari&bv=" + env.browserVersion.Safari;
            else
                statData += "others&bv=";

            // 浏览器的颜色方案
            statData += "&cs=" + getComputedStyle(document.documentElement)
                .getPropertyValue("--vlook-color-scheme").replaceAll("\"", "").trim();

            statData += "&lang=" + VLOOK.lang.id; // 浏览器语言
            statData += "&size=" + Dom.write().text().length; // 文档大小
            statData += "&time=" + loadTimeCost; // 加载文档时间

            // 图片插图数据
            statData += "&img=" + $("img").length;
            statData += "&img-fold=" + $("p[data-vk-container=img][data-vk-folded=true]").length;
            statData += "&img-iid=" + $("img[data-vk-invert=in-dark]").length;
            statData += "&img-cap1=" + $("div[id^=fig-num][fig-type=img] .mdx-figure-caption-1 span").length;
            statData += "&img-cap2=" + $("div[id^=fig-num][fig-type=img] .mdx-figure-caption-2").length;

            // mermaid 插图数据
            statData += "&mm=" + $(".md-diagram-panel").length;
            statData += "&mm-fold=" + $("div[data-vk-container=svg][data-vk-folded=true]").length;
            statData += "&mm-cap1=" + $("div[id^=fig-num][fig-type=svg] .mdx-figure-caption-1 span").length;
            statData += "&mm-cap2=" + $("div[id^=fig-num][fig-type=svg] .mdx-figure-caption-2").length;

            // mermaid 图的细类
            let pie = 0,
                flow = 0,
                flowSTART = 0,
                flowINIT = 0,
                state = 0,
                seq = 0,
                classD = 0,
                gantt = 0;
            $(".md-diagram-panel").each(function () {
                if ($(this).find("g.legend").length > 0)
                    pie++; // 饼图
                else if ($(this).find("g.output g.nodes").length > 0) {
                    flow++; // 流程图
                    if ($(this).find("g.output g.nodes g#START.node").length > 0)
                        flowSTART++; // VLOOK 标准的流程图
                    else if ($(this).find("g.output g.nodes g#INIT.node").length > 0)
                        flowINIT++; // VLOOK 标准的状态图
                }
                else if ($(this).find("g.stateGroup").length > 0)
                    state++; // 状态图（原生）
                else if ($(this).find("g rect.actor").length > 0)
                    seq++; // 顺序图
                else if ($(this).find("g.classGroup").length > 0)
                    classD++; // 类图
                else if ($(this).find("g rect.section").length > 0)
                    gantt++; // 甘特图
            });
            statData += "&mm-pie=" + pie;
            statData += "&mm-flow=" + flow;
            statData += "&mm-flow-S=" + flowSTART
            statData += "&mm-flow-I=" + flowINIT
            statData += "&mm-state=" + state;
            statData += "&mm-seq=" + seq;
            statData += "&mm-class=" + classD;
            statData += "&mm-gantt=" + gantt;

            // 表格数据
            statData += "&tbl=" + $("table").length;
            statData += "&tbl-fold=" + $("figure[data-vk-container=table][data-vk-folded=true]").length;
            statData += "&tbl-cap1=" + $("div[id^=tbl-num] .mdx-figure-caption-1 span").length;
            statData += "&tbl-cap2=" + $("div[id^=tbl-num] .mdx-figure-caption-2").length;

            // 表格列格式数据
            let fmBold = 0,
                fmEm = 0,
                fmUnderline = 0,
                fmMark = 0,
                fmDel = 0;
            $("table").each(function () {
                if ($(this).find("th.mdx-table-column-format-bold").length > 0)
                    fmBold++;
                if ($(this).find("th.mdx-table-column-format-em").length > 0)
                    fmEm++;
                if ($(this).find("th.mdx-table-column-format-underline").length > 0)
                    fmUnderline++;
                if ($(this).find("th mark").length > 0)
                    fmMark++;
                if ($(this).find("th del").length > 0)
                    fmDel++;
            });
            statData += "&tbl-fm-b=" + fmBold;
            statData += "&tbl-fm-em=" + fmEm;
            statData += "&tbl-fm-u=" + fmUnderline;
            statData += "&tbl-fm-m=" + fmMark;
            statData += "&tbl-fm-d=" + fmDel;

            // 代码块数据
            statData += "&cb=" + $(".md-fences").length;
            statData += "&cb-fold=" + $("p[data-vk-container=pre][data-vk-folded=true]").length;
            statData += "&cb-cap1=" + $("div[id^=code-block-num] .mdx-figure-caption-1 span").length;
            statData += "&cb-cap2=" + $("div[id^=code-block-num] .mdx-figure-caption-2").length;

            // 标签数据
            statData += "&tag=" + $("code[class^=mdx-tag-c]").length;
            statData += "&tag2=" + $("code[class^=mdx-tag-name]").length;

            // 引用数据
            statData += "&bq=" + $("blockquote").length;
            statData += "&bq-fold=" + $("blockquote p.mdx-blockquote-folder").length;

            // 脚注数据
            statData += "&fn=" + $(".md-footnote").length;

            // 当前文档的 URL
            statData += "&url=" + window.location.href;

            // 对数据进行编码
            statData = encodeURI(statData);

            // 提交统计数据
            $("iframe[name=vlook-stat-gitee]").attr("src",
                "https://madmaxchow.gitee.io/vlook/act/" + (VLOOK.debugMode ? "dev-" : "") + "stat-gitee.html"
                + statData);
            VLOOK.debug("Stat. in Gitee:\n" + $("iframe[name=vlook-stat-gitee]").attr("src"));
        },

        /**
         * 上报事件统计数据（基于百度统计）
         * 为兼容在本地打开的 HTML 文件，所以通过 iframe 的方式进行数据上报
         *
         * @param data 数据数组，与百度统计的 _hmt.push(["_trackEvent", data[0], data[1], data[2], data[3]) 的参数保持一致
         */
        push : function (data) {
            $("body").append('<iframe name="v-event-' + VLOOK.report.eventCount + '" style="display: block;" marginwidth="0" marginheight="0" frameBorder="0" scrolling="no" width="100%" height="0"'
                + ' src="https://madmaxchow.gitee.io/vlook/act/'
                + (VLOOK.debugMode ? "dev-" : "")
                + 'event-gitee.html'
                + "?category=" + (VLOOK.debugMode ? "dev-" : "") + data[0]
                + "&action=" + data[1]
                + "&label=" + data[2]
                + "&value=" + data[3]
                + "&debug=" + VLOOK.debugMode
                + '"></iframe>');

            setTimeout(VLOOK.report.recycleResources, 5000);

            VLOOK.report.eventCount++;
        },

        /**
         * 转换标签名为 VLOOK 中的特定内容类型名称
         */
        transTagName : function (tagName) {
            if (tagName === "img" || tagName === "svg")
                return "Figure";
            else if (tagName === "table")
                return "Table";
            else if (tagName === "pre")
                return "CodeBlock";
            return "Unknown";
        },

        /**
         * 移除上报事件的资源
         */
        recycleResources : function () {
            $("iframe[name^=v-event-]").each(function () {
                $(this).remove();
                return false; // 执行一次即跳出，即每次只删除当前最早创建的
            });
        },

        // 上报事件的累计次数，用于标识不同的上报事件 iframe 的 id
        eventCount: 0,
    } // VLOOK.report

    // 工具
    VLOOK.util = {
        /**
         * 获取 URL 中的参数数组
         */
        parseQueryString : function (url) {
            let hash = url.indexOf("#");
            url = hash > -1 ? url.substring(0, hash) : url; // 只截取 URL 中 # 前的内容

            let start = url.indexOf("?"),
                queryStr = url.substring(start > -1 ? start + 1 : url.length, url.length), // 获取url中"?"符后的字串
                args = {}, // 保存参数数据的对象
                items = (queryStr.length > 0) ? queryStr.split("&") : [], // 取得每一个参数项,
                item = null,
                len = items.length;

            // 将所有参数拆解至数组中
            for (let i = 0; i < len; i++) {
                item = items[i].split("=");
                let name = decodeURIComponent(item[0]),
                    value = decodeURIComponent(item[1]);
                if (name) {
                    args[name] = value;
                }
            }
            return args;
        },
    }

    // ==================== 处理耗时计时器类 ==================== //

    /**
     * 构造函数
     */
    function Stopwatch() {
        this.startTime = null; // 重置后的初始时间
        this.lapTime = null; // 每次中间计时的初始时间

        /**
         * 重置计时器
         */
        this.reset = function () {
            this.startTime = new Date().getTime();
        }

        /**
         * 一次中间计时开始
         */
        this.lapStart = function () {
            this.lapTime = new Date().getTime();
        }

        /**
         * 一次中间计时结束
         */
        this.lapStop = function () {
            let timeCost = new Date().getTime() - this.lapTime;
            console.info("    " + timeCost + " ms");
            return timeCost;
        }

        /**
         * 计时器结束
         */
        this.stop = function () {
            return new Date().getTime() - this.startTime;
        }

        // 初始化计时器
        this.reset();
    }

    // ==================== 欢迎屏 ==================== //

    /**
     * 构造函数
     */
    function WelcomeScreen() {
        this.ui = $(".mdx-load-screen"); // 欢迎屏主界面
        this.buttonEnter = $(".mdx-btn-load-screen"); // 关闭欢迎屏按钮
        this.tips = $(".mdx-load-screen-tips"); // 欢迎信息
        this.finished = false; // 是否已加载

        /**
         * 完成所有内容加载后调用
         */
        this.done = function () {
            this.ui.css("cursor", "default");
            this.stopAnimation();

            this.buttonEnter.text([
                "轻一点，轻轻一点",
                "輕一點，輕輕一點",
                "Click to Start",
                "Cliquez pour commencer",
                "Нажмите, чтобы начать",
                "クリックして開始",
                "클릭하여 시작"
            ][VLOOK.lang.id]);

            this.tips.css("animation", "none");
            this.buttonEnter.addClass("mdx-btn-load-screen-done");

            // 关闭欢迎屏事件
            let that = this;
            this.buttonEnter.unbind("click").click(function () {
                that.close();
            });

            this.finished = true;
        }

        /**
         * 停止加载时的呼吸动画
         */
        this.stopAnimation = function () {
            this.tips.css("animation", "none");
        }

        /**
         * 关闭欢迎屏
         */
        this.close = function () {
            VLOOK.doc.scroll.unfreeze();

            // 动画式显示
            if (VLOOK.ui.effect >= 2) {
                let that = this;
                this.ui.velocity({
                    top: -this.ui.height()
                }, {
                    duration: VLOOK.animate.speed,
                    complete: function () {
                        that.ui.hide();
                    }
                });
            }
            else {
                this.ui.css({
                    top: -this.ui.height()
                });
                this.ui.hide();
            }
        }
    }

    // =====c=============== 内容辅助工具类 ==================== //

    function ContentAssist() {}

    ContentAssist.button = {
        openInNewTab : $(".mdx-btn-open-in-new-tab"), // 在新标签中打开按钮
        copyCodeBlock : $(".mdx-btn-copy-code-block"), // 复制代码块按钮
    }

    // 绑定在新标签中打开按钮事件
    ContentAssist.button.openInNewTab.unbind("click").click(function () {
        ContentAssist.openInNewTab();
    });
    ContentAssist.button.openInNewTab.mouseout(function () {
        ContentAssist.mouseout();
    });

    // 复制代码块按钮事件
    ContentAssist.button.copyCodeBlock.unbind("click").click(function () {
        ExtCodeBlock.copyPlus();
    });
    ContentAssist.button.copyCodeBlock.mouseout(function () {
        ContentAssist.mouseout();
    });

    // 最后显示新标签打开按钮的内容（插图/表格等）
    ContentAssist.lastHoverContent = undefined;

    /**
     * 显示文档内容动作按钮
     */
    ContentAssist.showOpenInNewTabButton = function () {
        // 移动端不显示该动作按钮
        if (env.device.mobile)
            return;

        // 显示在新标签打开的按钮
        ContentAssist.button.openInNewTab.hide();
        ContentAssist.button.openInNewTab.css({
            "left": ContentAssist.lastHoverContent.offset().left,
            "top": ContentAssist.lastHoverContent.offset().top
        });

        // 动画式显示
        if (VLOOK.ui.effect >= 2)
            ContentAssist.button.openInNewTab.velocity("fadeIn", {
                duration: VLOOK.animate.speed
            });
        else
            ContentAssist.button.openInNewTab.show();
    }

    /**
     * 显示文档内容动作按钮
     */
    ContentAssist.showCopyCodeBlockButton = function () {
        // 移动端不显示该动作按钮
        if (env.device.mobile)
            return;

        ContentAssist.button.copyCodeBlock.hide();
        ContentAssist.button.copyCodeBlock.css({
            "left": ContentAssist.lastHoverContent.offset().left
                + ContentAssist.lastHoverContent.width()
                - ContentAssist.button.copyCodeBlock.width() + 4,
            "top": ContentAssist.lastHoverContent.offset().top
        });

        // 动画式显示
        if (VLOOK.ui.effect >= 2)
            ContentAssist.button.copyCodeBlock.velocity("fadeIn", {
                duration: VLOOK.animate.speed
            });
        else
            ContentAssist.button.copyCodeBlock.show();
    }

    /**
     * 隐藏内容辅助动作按钮
     */
    ContentAssist.hideButtons = function () {
        if (ContentAssist.lastHoverContent == undefined || ContentAssist.mouseDropIn() === false) {
            // 动画式显示
            if (VLOOK.ui.effect >= 2) {
                ContentAssist.button.openInNewTab.velocity("fadeOut", {
                    duration: VLOOK.animate.speed
                });
                ContentAssist.button.copyCodeBlock.velocity("fadeOut", {
                    duration: VLOOK.animate.speed
                });
            }
            else {
                ContentAssist.button.openInNewTab.hide();
                ContentAssist.button.copyCodeBlock.hide();
            }
        }
    }

    /**
     * 鼠标移出内容动作按钮后
     */
    ContentAssist.mouseout = function () {
        if (ContentAssist.mouseDropIn() === false) {
            ContentAssist.hideButtons();
        }
    }

    /**
     * 鼠标光标落入最后 Hover 的内容上
     */
    ContentAssist.mouseDropIn = function () {
        let e = (event || window.event),
            target = ContentAssist.lastHoverContent;
        const mx = e.pageX || e.clientX + document.body.scrollLeft;
        const my = e.pageY || e.clientY + document.body.scrollTop;
        return !(mx < target.offset().left || mx > (target.offset().left + target.width()) ||
            my < target.offset().top || my > (target.offset().top + target.height()));
    }

    /**
     * 在新标签页中打开插图/表格等内容
     */
    ContentAssist.openInNewTab = function () {
        ContentAssist.button.openInNewTab.hide();

        if (ContentAssist.lastHoverContent == undefined)
            return;

        let newTab = window.open("", "_blank"),
            content = ContentAssist.lastHoverContent.clone(), // 复制要在新标签中打开的内容
            tagName = ContentAssist.lastHoverContent.prop("tagName").toLowerCase();

        VLOOK.report.push(['Interactive', VLOOK.report.transTagName(tagName), 'OpenInNewTab', 0]);

        // 动态生成新标签的页面
        newTab.document.write("<!doctype html>");
        newTab.document.write($("html").html());
        // 取内容对应的题注为新标签页的标题
        newTab.document.title = ContentAssist.lastHoverContent.prev().text();

        // 初始化在新标签打开的页面的关键组件实例
        newTab.VLOOK.initIntance(true);
        newTab.OINT.init();

        // 内容为表格时
        if (tagName === "table") {
            // 恢复表格行号
            let rowNumFilter = "table tr > th:first-child, table tr > td:first-child, table tbody tr > td:first-child",
                container = content.wrap("<figure></figure>").parent();
            container.find(rowNumFilter).removeClass("mdx-table-row-num-hidden");

            // 添加 <h1> 是为能激活表格显示等号的样式
            newTab.OINT.append("<h1 style='display:none'></h1>");
            newTab.OINT.append(container);
        }
        // 内容为mermaid 图表时
        else if (tagName === "svg")
            newTab.OINT.append(content.wrap("<div class='md-diagram-panel'></div>").parent());
        // 内容为：图片、代码块
        else
            newTab.OINT.append(content);

        // 初始化在新标签打开的页面的 VLOOK
        newTab.VLOOK.initKernel(ColorScheme.scheme);

        // 将主文档中对应内容的题注数据更新到新标签中
        let caption1 = ContentAssist.lastHoverContent.prev().text(),
            caption2 = ContentAssist.lastHoverContent.next().attr("class") === "mdx-figure-caption-2" ? ContentAssist.lastHoverContent.next()
            .text() : null;
        newTab.OINT.updateFigureCaption(tagName, caption1, caption2);

        newTab.OINT.done();
    }

    // ==================== 聚光灯类 ==================== //

    /**
     * 构造函数
     * @param radius 半径大小
     */
    function Spotlight(radius) {
        this.ui = $(".mdx-spotlight"); // 聚光灯主界面
        this.event = undefined; // 鼠标事件对象
        this.radius = radius; // 聚光灯半径
        this.zoom = {
            normal: radius, // 标准大半径
            bigger: radius * 1.4, // 放大的半径
        };

        /**
         * 切换聚光灯的不同大小
         */
        this.toggleZoom = function () {
            if (this.ui.isHidden() === true)
                return;

            VLOOK.report.push(['Presentation', 'Spotlight', 'Zoom', 0]);

            this.radius = this.radius < this.zoom.bigger
                ? this.zoom.bigger
                : this.zoom.normal;

            this.repaint();
        }

        /**
         * 刷新聚光灯的显示
         *
         * @param event window.event 鼠标事件对象
         */
        this.repaint = function (event) {
            // 若有指定鼠标事件对象，则更新聚光灯关联的鼠标事件对象
            if (event !== undefined)
                this.event = event;

            if (this.ui.isHidden() === true)
                return;

            this.ui.css("background", "radial-gradient(circle at "
                + this.event.clientX + "px " + this.event.clientY + "px, "
                + "rgba(0, 0, 0, 0) " + this.radius + "px, "
                + "rgba(0, 0, 0, 0.7)" + (this.radius + 1) + "px)");
        }

        /**
         * 切换聚光灯的开关
         */
        this.toggle = function () {
            VLOOK.report.push(['Presentation', 'Spotlight', 'Show/Hide', 0]);

            // 未打开，则打开
            if (this.ui.isHidden() === true) {
                this.ui.show();
                this.repaint();
            }
            // 已打开，则关闭
            else {
                this.ui.hide();
            }
        }

        /**
         * 隐藏聚光灯
         */
        this.hide = function () {
            this.ui.hide();
        }
    }

    // ==================== 大纲导航类 ==================== //

    /**
     * 构造函数
     *
     * @param mask 遮罩对象
     */
    function OutlineNav(mask) {
        this.ui = $(".mdx-toc-panel"); // 大纲面板主界面

        this.title = $(".mdx-toc-panel-title"); // 大纲面板标题
        let that = this;
        this.title.unbind("click").click(function () {
            that.gotoCover();
        });

        this.body = $(".mdx-toc-panel-body"); // 大纲内容

        this.headers = []; // 大纲目录集
        this.currentHeaderIndex = -1; // 当前章节在目录集中的索引
        this.currentItem = undefined; // 当前章节对象

        this.closeMode = "auto"; // 关闭大纲的方式
        this.displayMode = "float"; // 最后一次的显示方式（float/block）
        this.showed = false; // 是否已显示

        // 大纲面板宽度
        this.width = parseInt(getComputedStyle(document.documentElement)
            .getPropertyValue("--vlook-toc-box-width"));

        this.foldItems = []; // 非叶子章节集
        this.lastHeaderFolder = undefined; // 上一个非叶子章节
        this.lastHeaderLevel = 0; // 上一个章节的层级
        // 大纲章节图标：已收起
        this.iconFold = '<svg width="20px" height="20px" style="display: inline-block; vertical-align: middle; margin-top: -4px;"><use xlink:href="#icoFolded" class="mdx-folder-ico"/></svg>';
        // 大纲章节图标：已展开
        this.iconUnfold = '<svg width="20px" height="20px" style="display: inline-block; vertical-align: middle; margin-top: -4px;"><use xlink:href="#icoUnfold" class="mdx-folder-ico"/></svg>';

        this.lastDocScrollTop = 0; // 记录最后一次文档滚动位置

        this.chapterNav = undefined; // 联动的章节导航栏
        this.toolbar = undefined; // 联动的工具栏

        this.mask = mask; // 遮罩
        this.mask.bindPartner(this);


        /**
         * 添加大纲节点
         *
         * @param item 由 Typora 生成的 [TOC] 大纲节点
         */
        this.add = function (item) {
            let a = item.children("a");

            // 将章节记录到目录集中
            let href = a.attr("href");
            this.headers.push(href.substring(1, href.length));

            // 自定义大纲节点元数据
            item.css("cursor", "pointer"); // 添加鼠标形状
            item.attr({
                "id": "v-header-" + item.attr("data-ref"), // 添加id属性
                "data-vk-node": "0", // 添加节点类型：0:叶子节点, 1:目录节点
                "data-vk-folded": "false", // 添加节点状态：true:收起, false:展开
                "title": a.text().trim()
            });
            // 使用完 <a> 的内容后，将章节中的链接文字提到链接外，用于实现长章节内容截断的 CSS 新式
            a.after(a.text());
            a.text("");

            // 点击大纲节点事件
            let that = this;
            item.unbind("click").click(function () {
                VLOOK.report.push(['Outline', 'Goto', 'TOC', 0]);
                // 跳转至对应的页内锚点
                location.href = $("#" + item.attr("id")).children("a").attr("href");
                if (that.displayMode === "float") {
                    that.hide("auto");
                    // 模拟等待页面完成跳转后，再进行大纲面板布局自适应处理
                    setTimeout(function () {
                        VLOOK.ui.adjustAll();
                    }, 500);
                }
            });

            // -----------------------------------
            // 大纲非叶子章节的折叠功能实现
            // 所有大纲节点都添加 folding 空白控件备用
            $("<div id='fd-v-header-" + item.attr("data-ref")
                + "' class='mdx-folder'>&nbsp;</div>")
                    .insertBefore(item.find("a"));

            // 记录所有非叶子节点的folder控件
            if (this.lastHeaderFolder !== undefined) {
                // 当前节点比上一个节点层级低，则上一节点为可折叠的节点
                if (this.parseHeaderLevel(item) > this.lastHeaderLevel) {
                    this.foldItems.push(this.lastHeaderFolder);

                    // 为非叶子的章节添加折叠图标
                    let folder = this.lastHeaderFolder.html(this.iconUnfold);
                    folder.parent().attr({
                        "data-vk-node": "1", // 0:叶子, 1:目录
                        "data-vk-folded": "false" // true:收起， false:展开
                    });

                    // 折叠控件事件
                    let that = this;
                    folder.unbind("click").click(function () {
                        VLOOK.report.push(['Outline', 'Assist', 'Fold/Unfold', 0]);
                        that.foldChapterItem($(this).parent().attr("id"));
                        event.cancelBubble = true;
                    });
                    // hover 事件处理
                    folder.hover(function () {
                        $(this).find("svg use").addClass("mdx-folder-ico-hover");
                    }, function () {
                        $(this).find("svg use").removeClass("mdx-folder-ico-hover");
                    });
                }
            }

            // 更新最后处理的folder控件
            this.lastHeaderFolder = $("#fd-v-header-" + item.attr("data-ref"));
            this.lastHeaderLevel = this.parseHeaderLevel(item);
        }

        /**
         * 页面滚动时根据页面当前的蘵，高亮对应大纲中的章节
         */
        this.focusHeader = function () {
            // ----------------------------------------
            // 控制执行频率，避免处理过快影响性能
            let scrollTop = $(document).scrollTop();
            if (Math.abs(scrollTop - this.lastDocScrollTop) < 50)
                return;
            this.lastDocScrollTop = scrollTop;

            // ----------------------------------------
            // 寻找文档当前显示的章节
            // 默认为最后一章
            let currentIndex = this.headers.length - 1;
            for (let i = 0, len = this.headers.length; i < len; i++) {
                let target = env.browser.Firefox === false
                    ? $("a[name='" + this.headers[i] + "']") // 非 Firefox 浏览器
                    : $("a[name='" + decodeURI(this.headers[i]) + "']"); // Firefox 浏览器
                let headerHeight = target.height();
                // 将最近一个章节从文档可视空间上方滚出的章节定义为「当前章节」
                if ((target.offset().top - $(document).scrollTop()) > (headerHeight / 2)) {
                    currentIndex = i - 1;
                    break;
                }
            }

            // 章节没有变化则直接退出
            if (this.currentHeaderIndex === currentIndex)
                return;
            // 章节有变化，并记录
            this.currentHeaderIndex = currentIndex;

            // 当前文档位置不在封面时
            if (this.withinHeader() === true) {
                // ----------------------------------------
                // 更新大纲内当前节点的样式
                // 先清除大纲中上一次的「当前章节」的样式
                if (this.currentItem !== undefined)
                    this.currentItem.removeClass("mdx-header-current");
                // 更新「当前章节」的样式
                this.currentItem = $("#vlook-toc a[href='#" + this.headers[currentIndex] + "']").parent();
                this.currentItem.addClass("mdx-header-current");

                // ----------------------------------------
                // 根据当前节点情况，大纲内的可视空间自动滚动该节点所在位置
                const preDis = this.currentItem.height() * 3, // 用于大纲节点触动滚动的大小
                    sTop = this.body.scrollTop(), // 大纲内当前滚动位置
                    sBottom = sTop + this.body.height(); // 当前可视空间中位于大纲底部的位置

                // 若当前节点在可视区域的上方，则滚动到该节点的位置
                if (this.currentItem.position().top < sTop)
                    this.body.scrollTop(this.currentItem.position().top);
                // 若当前节点在可视区域的上方，则滚动到该节点的位置
                else if (this.currentItem.position().top > (sBottom - preDis))
                    this.body.scrollTop(this.currentItem.position().top - this.body.height() + preDis);
            }

            this.chapterNav.update();
        }

        /**
         * 文档当前位置是否在章节内
         */
        this.withinHeader = function () {
            return this.currentHeaderIndex > -1;
        }

        /**
         * 显示/隐藏大纲面板
         *
         * @param callback 显示/隐藏大纲后执行回调函数
         */
        this.toggle = function (callback) {
            VLOOK.report.push(['Outline', 'Assist', 'Show/Hide', 0]);

            // 大纲面板已显示
            if (this.showed === true) {
                this.hide("manual");
            }
            // 大纲面板未显示
            else {
                this.closeMode = "auto";
                // 在封面，或小屏
                if (this.withinHeader() === false || VLOOK.ui.isSmallScreen() === true) {
                    this.show("float");
                }
                // 在章节内，非小屏
                else {
                    // 没有手动关闭大纲面板时，自动显示大纲面板
                    if (this.closeMode === "auto")
                        this.show("block");
                }
            }

            // typeof(callback) === "function" && callback();
            this.afterToggle();
        }

        /**
         * 显示大纲面板
         *
         * @param displayMode float: 以浮动形式显示，block: 以占位形式显示
         * @return true: 需要处理显示，false: 已显示，无须重复处理
         */
        this.show = function (displayMode, callback) {
            if (this.showed === true // 已显示
                || this.ui.offset().left > -this.width) // 在以动画显示过程中
                return false;

            // 以「占位方式」显示大纲面板
            this.displayMode = displayMode;
            if (this.displayMode === "block") {
                // 占位方式的样式设置
                this.ui.removeClass("mdx-toc-panel-float");
                this.ui.addClass("mdx-toc-panel-block");

                // 撑开文档正文区域
                if (VLOOK.ui.effect >= 2)
                    Dom.write().velocity({
                        marginLeft: this.width + 20
                    }, {
                        // easing: 500, VLOOK.animate.friction],
                        duration: VLOOK.animate.speed / 2
                    });
                else
                    Dom.write().css({
                        marginLeft: this.width + 20
                    });
            }
            // 以「浮动方式」显示大纲面板
            else if (this.displayMode === "float") {
                // 显示联动的遮罩
                this.mask.show();
                // 浮动方式的样式设置
                this.ui.removeClass("mdx-toc-panel-block");
                this.ui.addClass("mdx-toc-panel-float");

                // 若文档可视空间比大纲宽度要小，则进行微调
                if ($(window).width() < this.width + 40)
                    this.ui.css("width", $(window).width() - 20);
                // 若文档空间比大纲宽度大，则直接显示原始大小
                else
                    this.ui.css("width", this.width);
            }

            // 动画式显示
            if (VLOOK.ui.effect >= 2)
                this.ui.velocity({
                    left: 10
                }, {
                    easing: [VLOOK.animate.tension, VLOOK.animate.friction],
                    duration: VLOOK.animate.speed
                });
            else
                this.ui.css({
                    left: 10
                });

            // 以「占位方式」显示大纲面板时，须执行回调函数
            if (this.displayMode === "block")
                typeof(callback) === "function" && callback();

            this.showed = true;

            return true;
        }

        /**
         * 隐藏大纲
         *
         * @param closeMode 关闭大纲的的方式（auto/manual）
         * @return true: 需要处理隐藏，false: 已显示，无须重复处理
         */
        this.hide = function (closeMode) {
            if (this.showed === false // 已隐藏
                || this.ui.offset().left < 10) // 在以动画隐藏过程中
                return false;

            this.showed= false;

            // 若最后一次显示以是「占位方式」显示
            if (this.displayMode === "block") {
                // 记录是否手动关闭
                this.closeMode = closeMode;

                // 则取消对正文区的占位空间
                if (VLOOK.ui.effect >= 2)
                    Dom.write().velocity({
                        marginLeft: 0
                    }, {
                        duration: VLOOK.animate.speed
                    });
                else
                    Dom.write().css({
                        marginLeft: 0
                    });
            }

            // 动画式收起
            if (VLOOK.ui.effect >= 2) {
                this.ui.velocity({
                    left: -this.width
                }, {
                    duration: VLOOK.animate.speed
                });
            }
            else {
                this.ui.css({
                    left: -this.width
                });
            }

            // 恢复不挤压文档正文区
            Dom.write().css({
                marginLeft: 0
            });

            this.mask.hide();

            return true;
        }

        /**
         * 大纲面板根据规则进行布局的自适应处理
         *
         * @return true: 需要处理显示/隐藏，false: 已显示/隐藏，无须重复处理
         */
        this.adjust = function (callback) {
            let result = false;
            // 在封面，或为小屏
            if (this.withinHeader() === false || VLOOK.ui.isSmallScreen() === true) {
                // 自动隐藏大纲面板
                result = this.hide("auto");
            }
            // 不在封面
            else {
                // 没有手动关闭大纲面板时，自动显示大纲面板
                if (this.closeMode === "auto") {
                    // 以占位方式显示大纲面板
                    result = this.show("block");
                }
            }

            // 执行回调函数（等待文档完成重绘后再执行）
            setTimeout(function () {
                typeof(callback) === "function" && callback();
            }, 500);

            return result;
        }

        /**
         * 跳转回文档封面
         */
        this.gotoCover = function () {
            VLOOK.report.push(['Outline', 'Goto', 'Cover', 0]);

            location.href = "#";
            if (this.currentItem !== undefined) {
                this.currentItem.removeClass("mdx-header-current");
                this.currentHeaderIndex = -1;
            }

            iOutlineNav.adjust();
            iToolbar.adjust();
            iChapterNav.adjust();
        }

        /**
         * 跳转至指定章节
         */
        this.gotoHeader = function (target) {
            let dataAnchor = target.attr("data-vk-anchor");
            if (dataAnchor === "cover") {
                VLOOK.report.push(['ChapterNav', 'Nav', 'Cover', 0]);
                this.gotoCover();
            }
            else {
                VLOOK.report.push(['ChapterNav', 'Nav', 'Chapter', 0]);
                window.location.href = "#" + target.attr("data-vk-anchor");
            }
        }

        /**
         * 收起/展开章节目录
         *
         * @param id 对象的id值
         */
        this.foldChapterItem = function (id) {
            let tocItem = $("#" + id),
                folderIco = $("#fd-" + id + " > svg");

            // 若对应的章节已收起
            if (tocItem.attr("data-vk-folded") === "true") {
                tocItem.attr("data-vk-folded", "false");
                folderIco.prop("outerHTML", this.iconUnfold);

                this.disposeFold(id, "expand", true);
            }
            // 若对应的章节已展开
            else {
                tocItem.attr("data-vk-folded", "true");
                folderIco.prop("outerHTML", this.iconFold);

                this.disposeFold(id, "collect", true);
            }
        }

        /**
         * 处理展开或收起指定章节下的子章节
         *
         * @param id 对象的id值
         * @param action 执行动作（collect/expand）
         * @param child 是否遍历子元素
         */
        this.disposeFold = function (id, action, child) {
            let lastItem = null,
                itemSet = $("#" + id).nextAll();
            for (let i = 0, len = itemSet.length; i < len; i++) {
                let item = $(itemSet[i]);
                if (lastItem != null) {
                    const hd1 = this.parseHeaderLevel(item);
                    const hd2 = this.parseHeaderLevel(lastItem);
                    if (hd1 > hd2)
                        continue;
                    else if (hd1 < hd2)
                        break;
                }

                // 如果是目录节点，同时是已展开的，才进行递归调用展开子节点
                if (child === true && item.attr("data-vk-node") === "1" && item.attr("data-vk-folded") === "false")
                    this.disposeFold(item.attr("id"), action, child);

                if (action === "collect") // 收起
                    item.css("display", "none");
                else if (action === "expand") // 展开
                    item.css("display", "block");

                lastItem = item;
            }
        }

        /**
         * 返回指定对象的CSS的header的样式层级
         */
        this.parseHeaderLevel = function (target) {
            let cname = target.attr("class");
            return cname.substr(cname.indexOf("md-toc-h") + "md-toc-h".length, 1)
        }

        /**
         * 显示/隐藏大纲，并进行关联处理
         */
        this.afterToggle = function () {
            ContentAssist.button.openInNewTab.hide();
            if (iOutlineNav.displayMode === "block")
                iContentFolding.adjust();
        }
    }

    /**
     * 为Outline中子元素添加附加属性和事件
     */
    OutlineNav.init = function () {
        // 提取文档中由[toc]标签生成的文档目录作为浮动outline中的内容
        let toc = $(".md-toc");
        // 没有生成目录
        if (toc.isEmpty()) {
            OutlineNav.hideOnError();
            return false;
        }

        // 有生成目录，则复制 toc 内容
        let vlookToc = toc.clone();
        // 隐藏原目录
        toc.hide();
        // 将复制的目录进行唯一性标识
        vlookToc.find(".md-toc-content").attr("id", "vlook-toc")
        iOutlineNav.body.append(vlookToc);

        // 没有目录内容
        let tocContent = $("#vlook-toc");
        if (tocContent.isEmpty()) {
            OutlineNav.hideOnError();
            return false;
        }

        // 有目录内容
        tocContent.children(".md-toc-h1, .md-toc-h2, .md-toc-h3, .md-toc-h4, .md-toc-h5, .md-toc-h6").each(function () {
            // 只处理 h1-h5，添加为实际的大纲节点
            if ($(this).attr("class").indexOf("md-toc-h6") === -1)
                iOutlineNav.add($(this));
            // 移除 h6
            else
                $(this).remove();
        });

        return true;
    }

    /**
     * 隐藏大纲（异常情况使用）
     */
    OutlineNav.hideOnError = function () {
        iOutlineNav.hide();

        console.error([
            "文档中没有找到目录信息，请用Typora最新版本导出，并应用最新VLOOK插件",
            "文檔中沒有找到目錄信息，請用Typora最新版本導出，並應用最新VLOOK插件",
            "No [TOC] information was found in the document, export it with the latest version of Typora and apply the latest VLOOK plug-in.",
            "Les informations du répertoire ne figurent pas dans la documentation, veuillez les exporter avec la dernière version de Typora et appliquer le dernier plug-in VLOOK.",
            "Информация в каталоге не найдена в документации, пожалуйста, экспортируйте ее с последней версией Typora и примените последний плагин VLOOK",
            "ドキュメントにディレクトリ情報が見つからない場合は、Typoraの最新バージョンでエクスポートし、最新のVLOOKプラグインを適用してください",
            "설명서에 디렉토리 정보가 없으므로 Typora 최신 버전으로 내보내고 최신 VLOOK 플러그인을 적용하십시오."
        ][VLOOK.lang.id]);
    }

    // ==================== 逐章导航类 ==================== //

    /**
     * 构造函数
     *
     * @param outline 关联的大纲对象
     */
    function ChapterNav(outlineNav) {
        this.ui = $(".mdx-chapter-nav"); // 逐章导航面板主界面
        this.prev = {
            ui : $(".mdx-chapter-nav-prev"), // 前一章界面
            text: $(".mdx-chapter-nav-prev-text"), // 前一章文本界面
        };
        this.current = {
            ui : $(".mdx-chapter-nav-current"), // 当前章节界面
        };
        this.next = {
            ui : $(".mdx-chapter-nav-next"), // 后一章界面
            text : $(".mdx-chapter-nav-next-text"), // 后一章文本界面
        };
        this.outlineNav = outlineNav; // 关联的大纲对象

        /**
         * 更新逐章导航栏 UI 及数据
         */
        this.update = function () {
            let currentIndex = this.outlineNav.currentHeaderIndex;

            // ----------------------------------------
            // 更新「上一章」导航内容
            if (currentIndex > 0) {
                this.prev.ui.css("display", "block");
                this.prev.text.text($("a[href='#" + this.outlineNav.headers[currentIndex - 1] + "']").parent().attr("title"));
                this.prev.text.attr({
                    "title": this.prev.text.text(),
                    "data-vk-anchor": this.outlineNav.headers[currentIndex - 1]
                });
            }
            // 当前章节为第1章时特殊处理，设置为「封面」
            else if (currentIndex === 0) {
                this.prev.text.text([
                    "封面",
                    "封面",
                    "Cover",
                    "Couverture",
                    "передняя крышка",
                    "カバー",
                    "표지"
                ][VLOOK.lang.id]);
                this.prev.text.attr({
                    "title": this.prev.text.text(),
                    "data-vk-anchor": "cover"
                });
            }

            // ----------------------------------------
            // 更新「当前章节」导航内容
            if (this.outlineNav.currentItem !== undefined) {
                this.current.ui.text(this.outlineNav.currentItem.attr("title"));
                this.current.ui.attr("data-vk-anchor", this.outlineNav.headers[currentIndex]);
            }

            // ----------------------------------------
            // 更新「下一章」导航内容
            if (currentIndex < this.outlineNav.headers.length - 1) {
                this.next.ui.css("display", "block");
                this.next.text.text($("a[href='#" + this.outlineNav.headers[currentIndex + 1] + "']").parent().attr("title"));
                this.next.text.attr({
                    "title": this.next.text.text(),
                    "data-vk-anchor": this.outlineNav.headers[currentIndex + 1]
                });
            }
            else
                this.next.ui.css("display", "none");
        }

        /**
         * 显示逐章导航栏
         */
        this.show = function () {
            // 若已显示则直接退出
            if (parseInt(this.ui.css("top")) >= 0)
                return;

            this.ui.addClass("mdx-float-card");
            this.ui.css({
                top: 0
            });
        }

        /**
         * 隐藏逐章导航栏
         */
        this.hide = function () {
            // 若已隐藏则直接退出
            if (parseInt(this.ui.css("top")) < 0)
                return;

            this.ui.removeClass("mdx-float-card");
            this.ui.css({
                top: -50
            });
        }

        /**
         * 逐章导航栏自适应显示
         */
        this.adjust = function () {
            // 在封面时，隐藏逐章导航栏
            if (this.outlineNav.withinHeader() === false)
                this.hide();
            // 不在封面时，显示逐章导航栏
            else
                this.show();
        }

        /**
         * 逐章导航导航按钮在不同终端的适配处理
         * 
         * @param flag "mobile": 移动端，"desktop"：桌面端
         */
        this.adjustHoverStyle = function (flag) {
            // 移动设备时解绑样式事件
            if (flag === "mobile") {
                this.prev.ui.unbind("hover");
                this.current.ui.unbind("hover");
                this.next.ui.unbind("hover");
            }
            // 非移动设备时绑定样式事件
            else {
                // 上一章
                this.prev.ui.hover(function () {
                    if (VLOOK.ui.effect >= 1)
                        $(this).addClass("mdx-chapter-nav-prev-effect-hover");
                    else
                        $(this).addClass("mdx-chapter-nav-prev-noeffect-hover");
                }, function () {
                    if (VLOOK.ui.effect >= 1)
                        $(this).removeClass("mdx-chapter-nav-prev-effect-hover");
                    else
                        $(this).removeClass("mdx-chapter-nav-prev-noeffect-hover");
                });
                // 当前章节
                this.current.ui.hover(function () {
                    if (VLOOK.ui.effect >= 1)
                        $(this).addClass("mdx-chapter-nav-current-effect-hover");
                    else
                        $(this).addClass("mdx-chapter-nav-current-noeffect-hover");
                }, function () {
                    if (VLOOK.ui.effect >= 1)
                        $(this).removeClass("mdx-chapter-nav-current-effect-hover");
                    else
                        $(this).removeClass("mdx-chapter-nav-current-noeffect-hover");
                });
                // 下一单
                this.next.ui.hover(function () {
                    if (VLOOK.ui.effect >= 1)
                        $(this).addClass("mdx-chapter-nav-next-effect-hover");
                    else
                        $(this).addClass("mdx-chapter-nav-next-noeffect-hover");
                }, function () {
                    if (VLOOK.ui.effect >= 1)
                        $(this).removeClass("mdx-chapter-nav-next-effect-hover");
                    else
                        $(this).removeClass("mdx-chapter-nav-next-noeffect-hover");
                });
            }
        }
    }

    // ==================== 逐段导航类 ==================== //

    /**
     * 构造函数
     */
    function ParagraphNav() {
        this.count = 0; // 段的总数量
        this.currentIndex = -1; // 当前段索引号
        this.enabled = false; // 是否逐段导航激活

        /**
         * 返回当前段落
         */
        this.current = function () {
            if (this.currentIndex === -1)
                return undefined;
            return $("#v-blockfocus-" + this.currentIndex);
        }

        /**
         * 切换逐段导航开关
         */
        this.toggle = function (target) {
            this.enabled = !this.enabled;
            console.log("enabled", this.enabled);
            if (this.enabled === true) {
                VLOOK.report.push(['ParagraphNav', 'Action', 'Enabled', 0]);
                this.goto(target);
            }
            else
                this.hide();
        }

        /**
         * 添加段落
         */
        this.add = function (item) {
            item.attr("id", "v-blockfocus-" + this.count);
            item.attr("data-vk-blockfocus-idx", this.count);
            this.count++;
        }

        /**
         * 上一个段
         *
         * @param step 跳转的步长
         * @param return 跳转结果，true=成功，false=失败
         */
        this.prev = function (step) {
            if (this.enabled === false)
                return;

            VLOOK.report.push(['ParagraphNav', 'Action', 'Keyboard',0]);

            this.blurFocus();

            // 未到首段
            if (this.currentIndex > 0) {
                this.currentIndex = this.currentIndex - step;

                if (this.currentIndex < 0)
                    this.currentIndex = 0;

                // 如果目标内容块item跳转失败，则再尝试上一个
                if (this.goto() === false)
                    this.prev(1);

                return true;
            }
            return false
        }

        /**
         * 下一个段
         *
         * @param step 跳转的步长
         * @param return 跳转结果，true=成功，false=失败
         */
        this.next = function (step) {
            if (this.enabled === false)
                return;

            VLOOK.report.push(['ParagraphNav', 'Action', 'Keyboard', 0]);

            this.blurFocus();

            // 未到末段
            if (this.currentIndex < this.count - 1) {
                this.currentIndex = this.currentIndex + step;

                if (this.currentIndex > this.count - 1)
                    this.currentIndex = this.currentIndex - 1;

                // 如果目标内容块item跳转失败，则再尝试下一个
                if (this.goto() === false)
                    this.next(1);

                return true;
            }
            return false;
        }

        /**
         * 跳到指定的内容块，或最新的_blockFocusItemIndex指定的内容块
         *
         * @param target 跳转的目标。null: 指定跳到上/下一个位置，非null: 指定的目标位置
         */
        this.goto = function (target) {
            this.blurFocus();

            // 初始化目标段
            let item = (target !== undefined)
                ? target
                : this.current();

            // 若目标聚焦块不可视，则返回跳转失败
            if (item.isHidden())
                return false;

            // 添加高亮样式
            item.addClass("mdx-current-blockfocus-item");
            this.currentIndex = parseInt(item.attr("data-vk-blockfocus-idx"));

            // 显示工具栏新手提示：逐段导航模式
            if (window.localStorage && localStorage["VLOOK-" + VLOOK.version + "-hint-for-green-hand-step-bf"] ===
                undefined) {
                iInfoTips.show([
                        "<strong>已激活逐段导航模式</strong><br>鼠标直接点击内容，或键盘操作：<div style='text-align:left'><kbd>J</kbd> - 下一个<br><kbd>K</kbd> - 上一个<br><kbd>H</kbd> - 往回跳十个<br><kbd>L</kbd> - 往后跳十个<br><kbd>ESC</kbd> - 隐藏聚焦</div>",
                        "<strong>已激活逐段瀏覽模式</strong><br>鼠標點擊內容或鍵盤操作：<div style='text-align:left'><kbd>J</kbd>下一個<br><kbd>K</kbd>上一個<br><kbd>H</kbd>往前跳十個<br><kbd>L</kbd>往後跳十個<br><kbd>ESC</kbd> - 隱藏聚焦</div>",
                        "<strong>Segmented browsing mode activated</strong><br>Mouse click on the content, or keyboard operation:<div style='text-align:left'><kbd>J</kbd> - Next<br><kbd>K</kbd> - Previous<br><kbd>H</kbd> - Jump up ten<br><kbd>L</kbd> - Jump ten<br><kbd>ESC</kbd> - Hide focus</div>",
                        "<strong>Mode de navigation segmenté activé</strong><br>Cliquez sur le contenu ou sur le clavier:<div style='text-align:left'><kbd>J</kbd> - Suivant<br><kbd>K</kbd> - Précédent<br><kbd>H</kbd> - Saut dix en avant<br><kbd>L</kbd> - Saut dix en arrière<br><kbd>ESC</kbd> - Masquer le focus</div>",
                        "<strong>Сегментированный режим просмотра активирован</strong><br>Щелчок мышью по содержимому или операции с клавиатурой:<div style='text-align:left'><kbd>J</kbd> - Далее<br><kbd>K</kbd> - Предыдущий<br><kbd>H</kbd> - Прыгай десять вперед<br><kbd>L</kbd> - прыгай десять назад<br><kbd>ESC</kbd> - Скрыть фокус</div>",
                        "<strong>セグメント化されたブラウジングモードが有効</strong><br>コンテンツをマウスでクリックするかキーボード操作をします。<div style='text-align:left'><kbd>J</kbd> - 次へ<br><kbd>K</kbd> - 前へ<br><kbd>H</kbd> - 10ジャンプします<br><kbd>L</kbd> - 10ジャンプ<br><kbd>ESC</kbd> - フォーカスを隠す</div>",
                        "<strong>분류 된 브라우징 모드 활성화:<div style='text-align:left'><kbd>J</kbd> - 다음<br><kbd>K</kbd> - 이전<br><kbd>H</kbd> - 앞으로 10 칸 이동하십시오<br><kbd>L</kbd> - 점프 10 뒤로<br><kbd>ESC</kbd> - 포커스 숨기기</div>"
                    ][VLOOK.lang.id],
                    20000, false, true);
                localStorage["VLOOK-" + VLOOK.version + "-hint-for-green-hand-step-bf"] = true;
            }

            // 或目标段不在当前窗口显示区域内，则跳转到对应位置
            if (item.offset().top !== 0
                && ((item.offset().top - 50) < $(document).scrollTop()
                || (item.offset().top + 50) > ($(document).scrollTop() + $(window).height()))) {
                // $("html").animate({
                //     scrollTop: item.offset().top - c
                // }, VLOOK.animate.speed);
                $("html").velocity("scroll", {
                    offset: item.offset().top - $(window).height() / 2,
                    duration: VLOOK.animate.speed
                });
            }

            return true; // 返回跳转成功
        }

        /**
         * 让当前聚焦段其失去聚焦效果
         */
        this.blurFocus = function () {
            if (this.current() !== undefined)
                this.current().removeClass("mdx-current-blockfocus-item");
        }

        /**
         * 隐藏当前段落的高亮样式
         */
        this.hide = function () {
            this.enabled = false;
            this.blurFocus();
        }
    }

    /**
     * 初始化逐段导航模式
     */
    ParagraphNav.init = function() {
        iParagraphNav = new ParagraphNav();

        // 先清理多余的段落标签
        $("li > p:only-child").contents().unwrap();

        // 初始化
        $("h1, h2, h3, h4, h5, h6, ul > li, ol > li, p[class!=md-toc-content][class!=mdx-figure-caption-1][class!=mdx-figure-caption-2], figure, .md-diagram-panel, .MathJax_SVG_Display").each(function () {
            let item = $(this);
            // 跳过子元素有嵌套p的情况，如li > p
            if (item.children("p").length === 0) {
                iParagraphNav.add(item);

                // 双击内容块激活/关闭逐段导航模式模式
                item.dblclick(function () {
                    iParagraphNav.toggle(item);
                });

                // 单击内容块处理
                item.unbind("click").click(function () {
                    // 未激活逐段导航模式模式
                    if (iParagraphNav.enabled === false)
                        return;

                    VLOOK.report.push(['ParagraphNav', 'Action', 'Mouse', 0]);

                    // 当前内容块内表格已显示十字光柱
                    if (ExtTable.withCross($(this)) === false) {
                        ExtTable.hideCellCross(false);
                        iParagraphNav.goto(item);
                        event.stopPropagation(); // 停止事件冒泡
                    }
                });
            } // if
        });
    }

    // ==================== 工具栏类 ==================== //

    /**
     * 构造函数
     *
     * @param outlineNav 大纲导航对象
     * @param chapterNav 章节导航对象
     */
    function Toolbar(outlineNav, chapterNav) {
        this.ui = $(".mdx-toolbar"); // 工具栏主界面
        this.buttons = {}; // 工具栏按钮集
        this.outlineNav = outlineNav;
        this.chapterNav = chapterNav;

        /**
         * 添加按钮
         *
         * @param name 按钮标识
         * @param button 按钮对象
         */
        this.add = function (name, button) {
            this.buttons[name] = button;
        }

        /**
         * 自适应显示工具栏
         */
        this.adjust = function () {
            // 移动端下隐藏不必要的功能入口
            if (env.device.mobile === true) {
                this.buttons["spotlight"].hide();
                this.buttons["print"].hide();
            }

            // 如果是小屏，或在封面
            if (VLOOK.ui.isSmallScreen() || this.outlineNav.withinHeader() === false) {
                this.ui.children("div").addClass("mdx-float-card");

                // 小屏
                if (VLOOK.ui.isSmallScreen()) {
                    this.ui.css({
                        top: 50
                    });
                }

                // 调整工具栏样式
                this.ui.removeClass("mdx-backdrop-blurs");
                this.ui.removeClass("mdx-float-card");
                this.ui.css({
                    width: $(window).width() - 20,
                    background: "none"
                });

                // 为去掉工具栏背景的按钮添加浮动样式
                this.ui.children(".mdx-btn").addClass("mdx-btn-float");

                // 大屏，回到封面及最开始位置后进行二次调整
                if (VLOOK.ui.isSmallScreen() === false
                    && this.outlineNav.withinHeader() === false
                    && $(document).scrollTop() === 0) {
                        this.ui.css({
                        top: 10
                    });
                }else {
                    // 小屏，在非封面位置进行二次调整
                    if (VLOOK.ui.isSmallScreen() && this.outlineNav.withinHeader())
                        this.ui.css({
                            top: 50
                        });
                    else {
                        // 小屏，在封面及最开始后位置进行二次调整
                        if ($(document).scrollTop() === 0)
                            this.ui.css({
                                top: 10
                            });
                        // 小屏，在封面位置进行二次调整
                        else
                            this.ui.css({
                                top: 0
                            });
                    }
                }
            }
            // 宽屏，且不在封面
            else {
                if (this.ui.offset().top !== 0) {
                    this.ui.css({
                        width: "var(--vlook-toc-box-width)",
                        backgroundColor: this.chapterNav.ui.css("background-color")
                    });
                    this.ui.children("div").removeClass("mdx-float-card");
                    this.ui.addClass("mdx-backdrop-blurs");
                    this.ui.addClass("mdx-float-card");
                    this.ui.css({
                        top: 0
                    });

                    // 为增加了工具栏按钮的背景去掉浮动样式
                    this.ui.children(".mdx-btn").removeClass("mdx-btn-float");
                }
            }
        }
    }

    // ==================== 颜色方案类 ==================== //

    /**
     * 构造函数
     */
    function ColorScheme(button) {}

    ColorScheme.scheme = "light"; // 当前颜色以方案，light/dark
    ColorScheme.schemeBeforePrint = "light"; // 打印前的颜色方案

    /**
     * 切换颜色方案
     *
     * @param callback 切换颜色方案后回调该函数
     */
    ColorScheme.toggle = function () {
        VLOOK.report.push(['Style', 'ColorScheme', '', 0]);

        ColorScheme.scheme = (ColorScheme.scheme === "light") ? "dark" : "light";
        console.info("... Switching to [ " + ColorScheme.scheme + " ]");

        let preHtml = "<div style='display: table-cell; vertical-align: middle;'>",
            subHtml = "</div>";
        if (ColorScheme.scheme === "dark") {
            iInfoTips.show(preHtml + [
                "正在切换为：<br><span style='font-weight: bold; font-size: 1.5em;'>黑暗模式</span>",
                "正在切換為：<br/><span style='font-weight: bold; font-size: 1.5em;'>黑暗模式</span>",
                "Switching to: <br/><span style='font-weight: bold; font-size: 1.5em;'>Dark Mode</span>",
                "Passer à:<br/><span style='font-weight: bold; font-size: 1.5em;'>Mode Sombre</span>",
                "Переключение на:<br/><span style='font-weight: bold; font-size: 1.5em;'>Темный режим</span>",
                "切り替え先：<br/><span style='font-weight: bold; font-size: 1.5em;'>ダークモード</span>",
                "로 전환 :<br/><span style='font-weight: bold; font-size: 1.5em;'>다크 모드</span>"
            ][VLOOK.lang.id] + subHtml, 800, true, false);
        }else {
            iInfoTips.show(preHtml + [
                "正在切换为：<br/><span style='font-weight: bold; font-size: 1.5em;'>明亮模式</span>",
                "正在切換為：<br/><span style='font-weight: bold; font-size: 1.5em;'>明亮模式</span>",
                "Switching to: <br/><span style='font-weight: bold; font-size: 1.5em;'>Light Mode</span>",
                "Passer à: <br/><span style='font-weight: bold; font-size: 1.5em;'>Mode lumière</span>",
                "Переключение на: <br/><span style='font-weight: bold; font-size: 1.5em;'>Легкий режим</span>",
                "切り替え先：<br/><span style='font-weight: bold; font-size: 1.5em;'>ライトモード</span>",
                "로 전환 : <br/><span style='font-weight: bold; font-size: 1.5em;'>라이트 모드</span>"
            ][VLOOK.lang.id] + subHtml, 800, true, false);
        }

        // 延时再开始，以便让UI先完成更新
        setTimeout(function () {
            ColorScheme.apply();
        }, 500);

        // ColorScheme.afterToggle();
    }

    /**
     * 根据浏览器当前的颜色方案调整文档配色
     */
    ColorScheme.apply = function () {
        _lastTimer = new Date().getTime();

        // 对 mermaid 进行颜色方案适配
        ColorScheme.updateFigure();

        const varList = [
            "--vlook-invert-in-dark",
            "--doc-bg-color",
            "--doc-bg-color-alt",
            "--doc-bg-color-transparent",
            "--doc-bg-color-alt-transparent",
            "--fore-color",
            "--shadow-color",
            "--a-color",
            "--footer-note-bg-color",
            "--table-border-color",
            "--table-th-bg-color",
            "--table-th-border-color",
            // "--img-dark-filter",
            "--del-color",
            "--toc-header-num-color",
            "--header-color",
            "--header-box-shadow",
            "--header-bg-start-color",
            "--header-bg-end-color",
            "--code-bg-color",
            // "--code-bg-color-transparent",
            "--code-name-bg-color",
            "--code-name-shadow-color",
            "--tips-bg-color-inset",
            "--tips-bg-color",
            "--accent-color1",
            "--accent-color2",
            "--accent-color3",
            "--accent-color4",
            "--accent-color5",
            "--accent-color6",
            "--mermaid-accent-color1",
            "--mermaid-accent-color1-alt",
            "--mermaid-accent-color2",
            "--mermaid-accent-color2-alt",
            "--mermaid-accent-color3",
            "--mermaid-accent-color3-alt",
            "--mermaid-accent-color4",
            "--mermaid-accent-color4-alt",
            "--mermaid-accent-color5",
            "--mermaid-accent-color5-alt",
            "--mermaid-accent-color6",
            "--mermaid-accent-color6-alt",
            "--cm-keyword",
            "--cm-variable",
            "--cm-variable-2",
            "--cm-variable-3",
            "--cm-tag",
            "--cm-attribute",
            "--cm-CodeMirror-cursor",
            "--cm-string",
            "--cm-string-2",
            "--cm-comment",
            "--cm-header",
            "--cm-quote",
            "--cm-hr",
            "--cm-link",
            "--cm-negative",
            "--cm-positive",
            "--cm-meta",
            "--cm-bulidin",
            "--cm-bracket",
            "--cm-atom",
            "--cm-number"
        ];

        ColorScheme.updateUI();

        // 针对 Dark 模式进行图片反色适配处理
        ExtFigure.adjustImageInverInDarkMode();

        // 遍历所有变量实现ColorScheme切换
        for (let i = 0, len = varList.length; i < len; i++) {
            document.documentElement.style.setProperty(varList[i],
                getComputedStyle(document.documentElement).getPropertyValue(
                    varList[i] + "-" + ColorScheme.scheme));
        }

        iInfoTips.hide();

        console.info("    [ " + ((new Date().getTime() - _lastTimer) / 1000) + "s ]");
    }

    /**
     * 针对插图进行处理
     */
        ColorScheme.updateFigure = function () {
        let target = $(".mdx-figure, .mdx-figure-content svg");
        if (ColorScheme.scheme === "dark") {
            target.removeClass("mdx-figure-bg-light");
            target.addClass("mdx-figure-bg-dark");
        }
        else {
            target.removeClass("mdx-figure-bg-dark");
            target.addClass("mdx-figure-bg-light");
        }
    }

    /**
     * 更新颜色方案UI
     */
    ColorScheme.updateUI = function () {
        if (ColorScheme.scheme === "dark") {
            // 调整模式切换按钮图标
            iToolbar.buttons["color-scheme"].html(
                "<svg width='18px' height='18px'><use xlink:href='#icoDarkMode' class='mdx-button-ico-light'/></svg>"
            );
        }else {
            // 调整模式切换按钮图标
            iToolbar.buttons["color-scheme"].html(
                "<svg width='20px' height='20px'><use xlink:href='#icoLightMode' class='mdx-button-ico-light'/></svg>"
            );
        }
    }

    /**
     * 根据颜色方案对浏览器兼容性处理
     */
    ColorScheme.afterToggle = function () {
        $(".mdx-copyright").children("svg").html("<use xlink:href='#icoVLOOK-" + ColorScheme.scheme + "'></use>");

        if (ColorScheme.scheme === "dark") {
            // 因需针对不同颜色方案在不同浏览器的处理，所以不能直接通过 CSS 的 @supports ((backdrop-filter: blur(15px)) 来实现
            // 支持毛玻璃 backdrop-filter: blur() 的浏览器
            // if (env.browser.Chrome || env.browser.Safari) {
            // iMask.css({
            //     "background-color": "rgba(0, 0, 0, 0.3)"
            // });
            // iFigureViewer.css({
            //     "background-color": "rgba(0, 0, 0, 0.3)"
            // });
            // }
            // else { // 不支持
            // ColorScheme.mask.ui.css("background-color", "rgba(0, 0, 0, 0.9)");
            iOutlineNav.mask.ui.css("background-color", "rgba(0, 0, 0, 0.9)");
            iFigureViewer.ui.css("background-color", "rgba(0, 0, 0, 0.9)");
            // }
        }
        else {
            // 支持毛玻璃 backdrop-filter: blur() 的浏览器
            // if (env.browser.Chrome || env.browser.Safari) {
            // iMask.css({
            //     "background-color": "rgba(255, 255, 255, 0.3)"
            // });
            // iFigureViewer.css({
            //     "background-color": "rgba(255, 255, 255, 0.3)"
            // });
            // }
            // else { // 不支持
            // ColorScheme.mask.ui.css("background-color", "rgba(255, 255, 255, 0.9)");
            iOutlineNav.mask.ui.css("background-color", "rgba(0, 0, 0, 0.8)");
            iFigureViewer.ui.css("background-color", "rgba(0, 0, 0, 0.8)");
            // }
        }

        // 对 mermaid 进行颜色方案适配
        // adjustColorSchemeForMermaid();
    }

    // ==================== 字体风格类 ==================== //

    /**
     * 构造函数
     *
     * @param button 绑定的工具栏按钮
     * @param mask 遮罩对象
     */
    function FontStyler(button, mask) {
        this.button = button; // 绑定的工具栏按钮
        this.style = undefined; // 当前字体风格，sans：非衬线，serif：衬线
        this.mask = mask; // 遮罩
        this.mask.bindPartner(this);

        /**
         * 切换字体风格
         */
        this.toggle = function () {
            const fontInfo = "<br/>──<br/><span style='font-size: 0.8em'>" + [
                    "VLOOK 优先显示开源的思源黑体和思源宋体<br/>建议下载安装获得更好的视觉体验",
                    "VLOOK 優先顯示開源的思源黑體和思源宋體<br/>建議用戶下載安裝獲得更好的視覺體驗",
                    "VLOOK gives priority to the Noto Sans and Noto Serif<br/>suggesting to download and install for a better visual experience",
                    "VLOOK donne la priorité à Noto Sans et Noto Serif,<br/>suggérant de télécharger et d'installer pour une meilleure expérience visuelle",
                    "VLOOKUP отдает приоритет Noto Sans и Noto Serif,<br/>предлагая загрузить и установить для лучшего визуального восприятия",
                    "VLOOK は、Noto SansとNoto Serifを優先し<br/>より良い視覚的経験のためにダウンロードしてインストールすることを提案します",
                    "VLOOK 은 노토 산 (Noto Sans)과 노토 세리프 (Noto Serif)를<br/>우선시하여 더 나은 시각적 경험을 위해 다운로드하여 설치하도록 제안합니다"
                ][VLOOK.lang.id] +
                "</span><br/><a href='https://github.com/MadMaxChow/VLOOK/blob/master/FONT.md' target='_blank'>" + [
                    "下载",
                    "下載",
                    "Download",
                    "Télécharger",
                    "скачать",
                    "ダウンロード",
                    "다운로드"
                ][VLOOK.lang.id] + "</a>";

            if (this.style === "serif") {
                iInfoTips.show([
                    "切换至「<strong>非衬线 Sans-serif</strong>」字体",
                    "切換至「<strong>非襯線 Sans-serif</strong>」字體",
                    "Switch to \"<strong>Sans-serif</strong>\" Font",
                    "Basculer vers \"<strong>Sans-serif</strong>\" Fuente",
                    "Переключиться на шрифт \"<strong>Sans-serif</strong>\"",
                    "に切り替える「<strong>Sans-serif</strong>」フォント",
                    "전환「<strong>Sans-serif</strong>」글꼴"
                ][VLOOK.lang.id] + fontInfo, 10000, false, true);
                this.apply("sans");
            }else {
                iInfoTips.show([
                    "切换至 「<strong>衬线 Serif</strong>」字体",
                    "切換至「<strong>襯線 Serif</strong>」字體",
                    "Switch to \"<strong>Serif</strong>\" Font",
                    "Basculer vers \"<strong>Serif</strong> Police\"",
                    "Переключиться на шрифт \"<strong>Serif</strong>\"",
                    "に切り替える「<strong>Serif</strong>」フォント",
                    "전환「<strong>Serif</strong>」폰트"
                ][VLOOK.lang.id] + fontInfo, 10000, false, true);
                this.apply("serif");
            }
        }

        /**
         * 应用指定字体风格
         *
         * @param style 指定应用的字体风格（sans/serif），不指定则以为当前字体风格
         */
        this.apply = function (style) {
            // 修正无指定样式的情况
            if (style === undefined)
                style = this.style;

            VLOOK.report.push(['Style', 'FontStyle', style, 0]);

            // 需要进行字体风格应用的分类与范围
            const text = "body, .mdx-load-screen-tips, .noteText tspan",
            // const text = "body, .mdx-load-screen-tips, text[text-anchor=\"start\"] > tspan, .edgeLabel .label span, .messageText, .noteText tspan, .MathJax_SVG g text",
                title = "#write > h6:first-of-type, #write > h6:last-of-type",
                tag = ".mdx-tag-c1, .mdx-tag-c2, .mdx-tag-c3, .mdx-tag-c4, .mdx-tag-c5, .mdx-tag-c6, .mdx-tag-name1, .mdx-tag-name2, .mdx-tag-name3, .mdx-tag-name4, .mdx-tag-name5, .mdx-tag-name6, .mdx-tag-value1-alt, .mdx-tag-value2-alt, .mdx-tag-value3-alt, .mdx-tag-value4-alt, .mdx-tag-value5-alt, .mdx-tag-value6-alt, .mdx-tag-value1, .mdx-tag-value2, .mdx-tag-value3, .mdx-tag-value4, .mdx-tag-value5, .mdx-tag-value6",
                header = "h1, h2, h3, h4, h5, h6",
                bold = "strong, #write > h6:first-of-type strong, #write > h6:first-of-type em, table tr th, .mdx-table-column-format-bold, .mdx-toc-panel-title, .mdx-toc-panel-header, .mdx-btn-load-screen, .mdx-tool-tips, .mdx-info-tips, .mdx-toc-panel-header, .mdx-chapter-nav-current, .mdx-chapter-nav-prev-text, .mdx-chapter-nav-next-text, .mdx-toc-panel-title, .mdx-figure-caption > p, rect + text[text-anchor=\"middle\"] > tspan, rect + rect + text[text-anchor=\"middle\"] > tspan, .outline-item, a[name^=\"ref-footnote-\"], .md-toc-item, .md-fn-count, .mdx-toc-panel-footer, mdx-copyright, .label div, .cluster text, text.actor, .labelText tspan, .loopText tspan, g.state-note text > tspan, g.stateGroup .state-title, g.stateGroup text",
                code = "code, tt, .md-fences, kbd";

            // 移除当前的字体风格
            $(code).removeClass("mdx-font-code-" + this.style);
            $(tag).removeClass("mdx-font-code-" + this.style);
            $(tag).removeClass("mdx-font-bold-" + this.style);
            $(text).removeClass("mdx-font-text-" + this.style);
            $(header).removeClass("mdx-font-header-" + this.style);
            $(title).removeClass("mdx-font-title-" + this.style);
            $(bold).removeClass("mdx-font-bold-" + this.style);

            // 更新当前字体风格
            this.style = style;
            $(code).addClass("mdx-font-code-" + style);
            $(tag).removeClass("mdx-font-code-" + style); // 针对 code.addClass 后的调整
            $(tag).addClass("mdx-font-bold-" + style);
            $(text).addClass("mdx-font-text-" + style);
            $(header).addClass("mdx-font-header-" + style);
            $(title).addClass("mdx-font-title-" + style);
            $(bold).addClass("mdx-font-bold-" + style);

            // 更新绑定的按钮图标
            this.button.html("<svg width='18px' height='16px'><use xlink:href='#icoFont-"
                + this.style
                + "' class='mdx-button-ico-light'/></svg>");

            // 保存最后一次应用的字体风格
            localStorage["VLOOK-" + VLOOK.version + "-font-style"] = iFontStyler.style;
        }
    }

    // ==================== 脚注类 ==================== //

    /**
     * 构造函数
     *
     * @param mask 遮罩对象
     */
    function FootNote(mask) {
        this.ui = $(".mdx-footer-note-panel"); // 脚注主界面
        this.content = $(".mdx-footer-note-panel-content"); // 脚注内容区

        this.buttonSeeAll = $(".mdx-footer-note-panel-all"); // 查看所有脚注按钮
        let that = this;
        this.buttonSeeAll.unbind("click").click(function () {
            that.hide();
            // 跳转至所有脚注区域
            window.location.href = "#xFooterArea";
        });

        this.mask = mask; // 遮罩
        this.mask.bindPartner(this);

        /**
         * 显示脚注弹层
         */
        this.show = function () {
            // 显示关联的遮罩
            this.mask.show();
            // showMask(iFootNote, hideFootNote);

            if (VLOOK.ui.isSmallScreen())
                this.ui.css({
                    left: 20,
                    right: 20
                });
            else
                this.ui.css({
                    left: "15%",
                    right: "15%"
                });

            // 动画式显示
            if (VLOOK.ui.effect >= 2) {
                this.ui.show();
                this.ui.velocity({
                    bottom: 80 //+ VLOOK.animate.friction
                }, {
                    easing: [VLOOK.animate.tension, VLOOK.animate.friction],
                    duration: VLOOK.animate.speed
                });
            }
            else {
                this.ui.show();
                this.ui.css({
                    bottom: 90
                });
            }
        }

        /**
         * 隐藏脚注弹层
         */
        this.hide = function () {
            // 动画式显示
            if (VLOOK.ui.effect >= 2) {
                let that = this;
                this.ui.velocity({
                    bottom: -this.ui.height()
                }, {
                    // easing: [VLOOK.animate.tension, VLOOK.animate.friction],
                    duration: VLOOK.animate.speed
                }, function () {
                    that.ui.hide();
                });
            }
            else {
                this.ui.css({
                    bottom: -this.ui.height()
                });
                this.ui.hide();
            }

            this.mask.hide();
        }
    }

    /**
     * 初始化脚注
     */
    FootNote.init = function () {
        // 将脚注调整到封底前，VLOOK 规范的文档中最后一个 <h6> 是封底
        let footnotesArea = $(".footnotes-area");
        footnotesArea.insertBefore($("#write").children("h6:last"));

        // 移除默认的跳转属性
        let a = $("a[name^='ref-footnote-']");
        a.removeAttr("href");

        // 将脚注角标的事件替换为指定的处理事件
        a.unbind("click").click(function () {
            let target = $("a[name='df" + $(this).attr("name") + "']").parent().clone();

            // 更新脚注弹层内容区
            iFootNote.content.html(target);
            // 移除默认的返回链接
            target.find("a[name^='dfref-footnote']")[0].remove();

            // 显示脚注弹层
            iFootNote.show();
        });

        // 将脚注区锚点调整到生成HTML后的实际位置
        $("a[name='xFooterArea']").insertBefore(footnotesArea);
    }

    // ==================== 背景遮罩类 ==================== //

    /**
     * 构造函数
     */
    function BackgroundMask() {
        this.ui = $(".mdx-mask");
        this.partner = undefined;

        /**
         * 绑定联动对象
         *
         * @param partner 联动对象
         */
        this.bindPartner = function (partner) {
            this.partner = partner;
        }

        /**
         * 显示遮罩
         */
        this.show = function (callback) {
            // 冻结滚动
            VLOOK.doc.scroll.freeze();

            // 总是在 target 下显示
            this.ui.css("z-index", this.partner.ui.css("z-index") - 1);
            // 点击遮罩隐藏联动对象
            let that = this;
            this.ui.unbind("click").click(function () {
                // 取消冻结滚动
                VLOOK.doc.scroll.unfreeze();
                // 隐藏联动对应
                that.partner.hide();

                // 动画式显示
                if (VLOOK.ui.effect >= 2)
                    $(this).velocity("fadeOut", {
                        duration: VLOOK.animate.speed
                    });
                else
                    $(this).hide();
            });

            // 动画式显示
            if (VLOOK.ui.effect >= 2)
                this.ui.velocity("fadeIn", {
                    duration: VLOOK.animate.speed
                });
            else
                this.ui.show();
        }

        /**
         * 隐藏遮罩
         */
        this.hide = function () {
            // 取消冻结滚动
            VLOOK.doc.scroll.unfreeze();

            // 动画式显示
            if (VLOOK.ui.effect >= 2)
                this.ui.velocity("fadeOut", {
                    duration: VLOOK.animate.speed
                });
            else
                this.ui.hide();
        }
    }

    // ==================== 长内容折叠类 ==================== //

    function ContentFolding() {
        this.ui = $(".mdx-content-expander"); // 展开操作区的 UI 模板
        this.limit = VLOOK.debugMode ? 300 : 800; // 内容须折叠的高度限值
        this.contents = []; // 须进行折叠判断和处理的内容集
        this.buildTimers = [];

        /**
         * 添加内容
         */
        this.add = function (content) {
            this.contents.push(content);
        }

        /**
         * 适配内容展开操作区
         */
            this.adjust = function () {
            // 提前中断未完成的处理
            if (this.buildTimers.length > 0) {
                for (let i = 0, len = this.buildTimers.length; i < len; i++)
                    clearTimeout(this.buildTimers.shift());
            }
            // 重新开始构建内容展开操作区
            this.rebuild();
        }

        /**
         * 重建部分内容展开操作区，主要是 img, table, .md-fences 等会因大纲面板的显示/关闭
         * 导致文档宽度变化而引起的内容高度也跟随变化的情况
         * 如在不显示大纲时因宽度较变，高度等比变高，或高度反而变短
         * 会导致应该显示展开操作区即不显示，或不应显示却显示的情况
         */
        this.rebuild = function () {
            // 重建需要重建的部分
            let that = this;
            for (let i = 0, len = this.contents.length; i < len; i++) {
                // img 类长内容
                if (this.contents[i].prop("tagName").toLowerCase() === "img") {
                    // 创建一个Image对象，实现图片的预下载
                    var img = new Image();
                    img.src = this.contents[i].attr("src");
                    // 如果图片已经存在于浏览器缓存，直接处理
                    if (img.complete)
                        this.buildTimers.push(
                            setTimeout(function () {
                                that.checkAndProcess(that.contents[i], true);
                            }, i * 100)
                        );
                    // 等待图片下载完成后再处理
                    else
                        img.onload = function () {
                            VLOOK.debug("img [" + img.src + "] loaded");
                            that.checkAndProcess(that.contents[i], true);
                        }
                }
                // 非 img 类长内容
                else {
                    // 设置按不同时间间隔执行，减少在处理数量过多时，会阻塞 UI
                    this.buildTimers.push(
                        setTimeout(function () {
                            that.checkAndProcess(that.contents[i], true);
                        }, i * 100)
                    );
                }
            }
        }

        /**
         * 检测内容是否过长，过长则进行处理。适用于「插图、表格、代码块」等
         *
         * @param target 折叠的目标对象
         * @param rebuild 本次折叠是否属于重建的（如在页面加载后，由于页面正文区宽度变化后调用时属于重建）
         */
        this.checkAndProcess = function (target, rebuild) {
            // 若为在新标签打开的，则忽略
            if (VLOOK.doc.newTab === true) {
                this.buildTimers.shift();
                console.log(this.buildTimers.length);
                return;
            }

            let container = target.parent(),
                tagName = target.prop("tagName").toLowerCase();

            // 重建时已生成题注，所以实际容器对象与初始化时第一次构建会不同
            if (rebuild === true)
                container = container.parent();

            // 获得上一轮构建时生成的展开操作区，没有则初始为 undefined
            let oldExpander = container.next(),
                className = oldExpander.attr("class");
            if (oldExpander !== undefined) {
                if (className === undefined
                    || className.indexOf("mdx-content-expander") === -1)
                    oldExpander = undefined;
            }

            // 已被点击展开过了，在重建时则跳过
            if (container.attr("data-vk-expanded") === "true"
                && container.attr("data-vk-before-print-folded") !== "true") {
                this.buildTimers.shift();
                console.log(this.buildTimers.length);
                return;
            }

            // 针对 img 内容，进行父容器的正确性处理
            if (tagName === "img") {
                // 图像若加载晚于 img 的题注生成，其父容器则题注而不是 VLOOK 标记的 img 父容器
                if (container.attr("data-vk-container") === undefined)
                    container = container.parent();
            }

            // 初始化折叠配置
            container.attr("data-vk-folded", "false"); // 未折叠
            container.attr("data-vk-expanded", "false"); // 已被点击扩展了
            container.css("height", "auto");

            let tHeight = parseInt(target.css("height"));
            // 高度超出折叠要求高度时进行折叠
            if (tHeight > this.limit) {
                // 构建内容展开操作区
                this.buildContentExpander(target, container, tagName, tHeight, oldExpander);
            }
            // 高度没有超出折叠要求
            else {
                // 若之前须折叠，目前不需要折叠，则清除对应的展开操作区
                if (oldExpander !== undefined && className !== undefined
                    && className.indexOf("mdx-content-expander") > -1)
                        oldExpander.remove();
            }

            this.buildTimers.shift();
        }

        /**
         * 构建内容展开操作区
         *
         * @param target 为目标对象创建展开操作区（如 table）
         * @param container 指定对象所属的容器（如 table 的容器为父元素 figure）
         * @param tagName target 的 HTML 标签名
         * @param tHeight target 的高度
         * @param oldExpander 上一轮重建前的展开操作区（没有则为 undefined）
         */
        this.buildContentExpander = function (target, container, tagName, tHeight, oldExpander) {
            // 设置为已折叠
            container.attr("data-vk-folded", "true");

            // 表格或 mermaid 图表的特性处理
            if (tagName === "table" || tagName === "svg") {
                container.css({
                    "height": this.limit,
                    "overflow-x": "auto", // 可横向滚动
                    "overflow-y": "hidden"
                });
            }
            // 非表格，非mermaid 图表的处理
            else {
                container.css({
                    "height": this.limit,
                    "overflow": "hidden"
                });
            }

            let expander = undefined,
                rowNumFilter = "table tr > th:first-child, table tr > td:first-child, table tbody tr > td:first-child",
                w = parseInt(container.css("width"));

            // 上一轮构建时没有生成展开操作区，则生成一个新的
            if (oldExpander === undefined) {
                expander = iContentFolding.ui.clone();
                container.after(expander);
            }
            // 直接复用上一轮构建时生成的展开操作区
            else
                expander = oldExpander;

            // 如果处理对象为表格，先隐藏表格行号，find 过滤器的内容与对应的 css 要同步更新
            if (container.find("table").length > 0)
                container.find(rowNumFilter).addClass("mdx-table-row-num-hidden");

            // 动态生成按钮文本内容
            let btn = expander.find("div > span");
            btn.html(btn.attr("title") + " <span style='font-weight: normal;'>"
                + parseInt((1 - this.limit / tHeight) * 100) + "%</span>");

            // 重新适配展开操作区尺寸
            if (w > parseInt(target.css("width"))) {
                w = target.css("width");
                // 表格、mermarid 插图与比容器宽度小时，右下角不是圆角，须进行适配调整
                expander.css({
                    "border-bottom-right-radius": 0
                });
            }
            expander.attr("data-vk-content-type", tagName);
            expander.css({
                "margin-left": container.css("margin-left"),
                "width": w
            });
            // 设置为可视
            expander.css("visibility", "visible");

            // 展开按钮 click 事件处理
            expander.children(".mdx-btn").unbind("click").click(function () {
                VLOOK.report.push(['Interactive', VLOOK.report.transTagName(tagName), 'ExpandLongContent', 0]);

                let expander = $(this).parent(),
                    container = expander.prev();

                // 移除内容展开操作区
                expander.remove();

                // 展开对应的内容
                container.attr("data-vk-folded", "false");
                container.attr("data-vk-expanded", "true");
                container.css({
                    "height": "auto"
                });
                // 针对表格、mermaid 图表增加滚动属性
                if (tagName === "svg" || tagName === "table")
                    container.css({
                        "overflow": "auto"
                    });

                // 如果处理对象为表格，恢复显示表格行号，find 过滤器的的内容与对应的 css 要同步更新
                if (container.find("table").length > 0)
                    container.find(rowNumFilter).removeClass("mdx-table-row-num-hidden");
            });
            // 展开按钮 hover 事件处理
            expander.children(".mdx-btn").hover(function () {
                $(this).addClass("mdx-btn-hover");
            }, function () {
                $(this).removeClass("mdx-btn-hover");
            });
        }
    }

    // ==================== 工具提示信息类 ==================== //

    /**
     * 构造函数
     */
    function ToolTips() {
        this.ui = $(".mdx-tool-tips");

        /**
        * 显示工具提示信息
        *
        * @param follow 提示的目标元素
        * @param align 强制指定工具提示的水平对齐方式（auto/left/center/right）
        */
        this.show = function (follow, align) {
            if (env.device.mobile === true)
                return;

            clearTimeout(VLOOK.animate.tipsTimer);

            this.hide();
            // hideToolTips();
            this.ui.html(follow.attr("data-vk-tips"));

            const fp = follow.parent();
            const ow = this.ui.width();
            const ww = $(window).width();
            const gap = 30;
            let left = follow.offset().left;
            this.ui.css({
                "border-top-left-radius": "0",
                "border-top-right-radius": "15px"
            });

            // 指定对齐方式或提示超出屏幕
            if (align != "auto" || (left + ow + gap) > ww) {
                // align: right
                this.ui.css({
                    "border-top-left-radius": "15px",
                    "border-top-right-radius": "0"
                });
                left = follow.offset().left - ow + follow.width() - gap;

                // align: center
                if (align === "center") {
                    left = follow.offset().left + (follow.width() - ow) / 2 - gap / 2;
                    this.ui.css({
                        "border-top-left-radius": "15px",
                        "border-top-right-radius": "15px"
                    });
                }
            }

            this.ui.css({
                "left": left,
                "top": fp.offset().top - $(document).scrollTop() + fp.height() +
                    (fp.css("background-color") === "rgba(0, 0, 0, 0)" ? 0 : 10)
            });

            let that = this;
            VLOOK.animate.tipsTimer = setTimeout(function () {
                // alert(VLOOK.ui.effect);
                if (VLOOK.ui.effect >= 2)
                    that.ui.velocity("fadeIn", {
                        duration: VLOOK.animate.speed
                    });
                else
                    that.ui.show();
            }, 1000);
        }

        /**
         * 隐藏工具提示
         */
        this.hide = function () {
            VLOOK.doc.scroll.unfreeze();
            clearTimeout(VLOOK.animate.tipsTimer);
            this.ui.hide();
        }
    }

    // ==================== 弹层提示信息类 ==================== //

    /**
     * 构造函数
     *
     * @param mask 遮罩对象
     */
    function InfoTips(mask) {
        this.ui = $(".mdx-info-tips");
        let that = this;
        this.ui.unbind("click").click = function () {
            that.hide();
        }

        this.mask = mask; // 遮罩
        this.mask.bindPartner(this);

        /**
        * 显示通知提示信息
        *
        * @param message 提示内容
        * @param delay 延时指定 ms 时间后自动关闭提示
        * @param fullscreen 是否为全屏显示
        * @param mask 是否显示遮罩
        */
        this.show = function (message, delay, fullscreen, mask) {
            clearTimeout(VLOOK.animate.tipsTimer);

            this.ui.html(message);
            // 先重置为默认值
            this.ui.css({
                width: "",
                height: "",
                right: "auto",
                bottom: "auto",
                borderRadius: 15
            });

            // 全屏显示
            if (fullscreen === true) {
                this.ui.css({
                    display: "table", // 配合子元素的 display: table-cell 实现内容的垂直居中
                    width: "100%",
                    height: "100%",
                    left: 0,
                    top: 0,
                    right: 0,
                    bottom: 0,
                    borderRadius: 0
                });
            }
            // 非全屏显示
            else {
                if (env.device.mobile) {
                    this.ui.css({
                        left: 10,
                        right: 10,
                        top: ($(window).height() - this.ui.height()) / 2
                    });
                }else {
                    this.ui.css({
                        left: ($(window).width() - this.ui.width()) / 2,
                        right: "auto",
                        top: ($(window).height() - this.ui.height()) / 2
                    });
                }
            }

            // 动画式显示
            let that = this;
            if (VLOOK.ui.effect >= 2) {
                this.ui.velocity("fadeIn", {
                    duration: VLOOK.animate.speed
                    }, function () {
                        if (delay != null) // 延时后自动关闭
                            VLOOK.animate.tipsTimer = setTimeout(function () {
                                that.hide();
                            }, delay);
                });
            }
            else {
                this.ui.show();
                if (delay != null) // 延时后自动关闭
                    VLOOK.animate.tipsTimer = setTimeout(function () {
                        that.hide();
                    }, delay);
            }

            // 冻结滚动
            VLOOK.doc.scroll.freeze();

            // 显示遮罩
            if (mask === true)
                this.mask.show();
        }

        /**
         * 隐藏弹窗信息
         */
        this.hide = function () {
            // 动画式显示
            if (VLOOK.ui.effect >= 2)
                this.ui.velocity("fadeOut", {
                    duration: VLOOK.animate.speed
                });
            else
                this.ui.hide();

            this.mask.hide();
        }
    }

    // ==================== 题注生成器类 ==================== //

    function CaptionGenerator() {}

    /**
     * 生成题注
     *
     * @param target 需要添加题注的对象
     */
    CaptionGenerator.action = function (target) {
            let tagName = target.prop("tagName").toLowerCase(),
                caption = "";
            // 代码块
            if (tagName === "pre")
                caption = [
                    "代码块 ",
                    "代碼塊 ",
                    "Code Block ",
                    "Bloc de Code ",
                    "Блок Кода ",
                    "コードブロック ",
                    "코드 블록 "
                ][VLOOK.lang.id] + (VLOOK.doc.counter.codeBlock + 1);
            // 表格
            else if (tagName === "table")
                caption = [
                    "表 ",
                    "表 ",
                    "Table ",
                    "Table ",
                    "Таблица ",
                    "テーブル ",
                    "표 "
                ][VLOOK.lang.id] + (VLOOK.doc.counter.table + 1);
            else {
                CaptionGenerator.actionForFigureLike(target, tagName);
                return;
            }

            // 有指定的题注文本
            let fc = null,
                fc2 = null,
                fcSet = CaptionGenerator.getCaptions(target.parent().prev());
            fc = fcSet[0]; // 第 1 题注
            fc2 = fcSet[1]; // 第 2 题注

            if (fc != null && fc.trim().length > 0) {
                // 添加 <span> 用主要用于区分题注是默认无内容的，还是指定内容的
                caption = caption + ": <span>" + fc + "</span>";
            }

            // 代码块
            if (tagName === "pre") {
                target.wrap("<div id='code-block-num" + VLOOK.doc.counter.codeBlock
                    + "' class='mdx-figure-caption' style='width: 100%'></div>");
            }
            // 表格
            else if (tagName === "table") {
                target.wrap("<div id='tbl-num" + VLOOK.doc.counter.table
                    + "' class='mdx-figure-caption'></div>");
            }

            // 添加第 1 题注
            target.before("<p class='mdx-figure-caption-1'>" + caption + "</p>");

            // 添加第 2 题注
            if (fc2 != null && fc2.length > 0) {
                target.after("<p class='mdx-figure-caption-2'>" + fc2 + "</p>");
            }
    }

    /**
     * 针对插图（img、mermaid）生成题注
     *
     * @param target 需要添加题注的对象
     * @param tagName HTML 标签名
     */
    CaptionGenerator.actionForFigureLike = function (target, tagName) {
        let fc = target.attr("alt"), // 获取图片的 alt 内容作为题注内容
        fc2 = target.attr("title"); // 获得图片的 title 作为第二题注内容
        // tagName = target.prop("tagName").toLowerCase();

        // 尝试获取最近的段落（如<p>、<h6>）作为题注内容
        let fcSet = CaptionGenerator.getCaptions(target.parent().prev().prev());
        if (fcSet[0] != null) {
            if (fcSet[0] != null)
                fc = fcSet[0];
            if (fcSet[1] != null)
                fc2 = fcSet[1];
        }

        // 插图（img、mermaid）题注前缀
        let caption = [
                "图 ",
                "圖 ",
                "Figure ",
                "La figure ",
                "карта ",
                "図 ",
                "그림 "
            ][VLOOK.lang.id] + (VLOOK.doc.counter.figure + 1);
        // 音频题注
        if (tagName === "audio")
            caption = [
                "音频 ",
                "音頻 ",
                "Audio ",
                "l'audio ",
                "аудио ",
                "オーディオ ",
                "오디오 "
            ][VLOOK.lang.id] + (VLOOK.doc.counter.audio + 1);
        // 视频频题注
        else if (tagName === "video")
            caption = [
                "视频 ",
                "視頻 ",
                "Video ",
                "Vidéo ",
                "видео ",
                "ビデオ ",
                "비디오 "
            ][VLOOK.lang.id] + (VLOOK.doc.counter.video + 1);

        // 有指定的题注文本
        if (fc != null && fc.trim().length > 0)
            caption = caption + ": <strong>" + fc + "</strong>";

        // 为插图（mermaid）增加题注
        if (tagName === "svg")
            // 针对 mermaid 插图，添加额外的类，用于打印前后处理时直接定位 mermaid 插图的题注
            target.wrap("<div id='fig-num" + VLOOK.doc.counter.figure + "' fig-type='" + tagName
                + "' class='mdx-figure-caption mdx-figure-caption-mermaid'></div>");
        // 为插图（img）增加题注
        else if (tagName === "img")
            target.wrap("<div id='fig-num" + VLOOK.doc.counter.figure + "' fig-type='" + tagName
                + "' class='mdx-figure-caption'></div>");
        // 为音频增加题注
        else if (tagName === "audio")
            target.wrap("<div id='fig-num" + VLOOK.doc.counter.audio + "' fig-type='" + tagName
                + "' class='mdx-figure-caption'></div>");
        // 为视频增加题注
        else if (tagName === "video")
            target.wrap("<div id='fig-num" + VLOOK.doc.counter.video + "' fig-type='" + tagName
                + "' class='mdx-figure-caption'></div>");

        target.before("<p class='mdx-figure-caption-1'>" + caption + "</p>");
        if (fc2 != null && fc2.length > 0) {
            target.after("<p class='mdx-figure-caption-2'>" + fc2 + "</p>");
        }

        // 修正在 SVG 插图套上题注后的自适应尺寸
        if (tagName === "svg") {
            if (target.attr("height") !== "none" || target.css("height") !== "none") { // 有指定高度的
                target.removeAttr("height");
                target.css("height", "");
            }

            // 调整SVG插图，尽量按其真实插图的大小显示，超出浏览器宽度的，则左右滚动浏览
            if (target.css("max-width") !== "none") // CSS 中指定了最大宽度
                target.parent().css("width", target.css("max-width"));
            else if (target.attr("style").indexOf("width") > -1) // 通过 style 指定了宽度
                target.parent().css("width", target.css("width"));
            else if (target.attr("width") !== "100%") // 指定了 width 属性，且不为 100%
                target.parent().css("width", parseInt(target.attr("width")) + 4); // 4 为两边 border 的宽度
            else if (target.attr("viewBox") !== "none") // 指定 width 为 100% 的情况
                target.parent().css("width", target.attr("viewBox").split(" ")[2] + "px");
            else
                target.parent().css("width", "100%");
        }
    }

    /**
     * 返回插图、表格、代码块上方的题注
     */
    CaptionGenerator.getCaptions = function (target) {
        let fcSet = [], // 题注集
            tagName = target.prop("tagName"),
            hideCaptionSrc = true; // 是否隐藏题注源

        // 双题注的标准语法
        if (CaptionGenerator.getCaptionCount(target) === 2) {
            fcSet[0] = CaptionGenerator.getCaptionSet(target, 2)[0];
            fcSet[1] = CaptionGenerator.getCaptionSet(target, 2)[1];
        }
        // 单题注的标准语法
        else if (CaptionGenerator.getCaptionCount(target) === 1) {
            fcSet[0] = CaptionGenerator.getCaptionSet(target, 1)[0];
            fcSet[1] = null;
        }
        // 无题注语法，但由 h6 引导
        else if (tagName !== undefined && tagName.toLowerCase() === "h6") {
            fcSet[0] = target.text().trim();
            fcSet[1] = null;
            hideCaptionSrc = false; // 不隐藏题注源
        }
        // console.log(target.prop("tagName"));
            
        // 若成功匹配出题注，则隐藏原始内容
        if (hideCaptionSrc === true
            && fcSet[0] != null
            && target != null
            && target.prop("tagName") !== undefined) {
            target.hide();
        }
        return fcSet;
    }

    /**
     * 返回匹配的题注数量
     *
     * @return 0/1/2
     */
    CaptionGenerator.getCaptionCount = function (target) {
        let reg2 = /^!\[.+\]\".+\"$/; // 有2个题注
        let reg1 = /^!\[.+\]$/; // 只有1个题注
        if (reg2.test(target.text().trim()) === true)
            return 2;
        else if (reg1.test(target.text().trim()) === true)
            return 1;
        return 0; // 无题注
    }

    /**
     * 返回题注数据数组
     *
     * @return [0] 为第 1 个题注，[1] 为第 2 个题注
     */
    CaptionGenerator.getCaptionSet = function(target, count) {
        let fcSet = [],
            text = target.text().trim();
        fcSet[0] = text.substring(2, text.indexOf("]"));
        if (count === 2)
            fcSet[1] = text.substring(text.indexOf("]\"") + 2, text.length - 1);
        return fcSet;
    }

    // ==================== 代码块增强类 ==================== //

    function ExtCodeBlock() {}

    /**
     * 初始化代码块
     */
    ExtCodeBlock.init = function () {
        $(".md-fences").each(function () {
            let codeBlock = $(this);

            // 外套一个 <p> 标签，用于内容折叠时与插图、表格的 DOM 结构一致
            codeBlock.wrap("<p data-vk-container='pre' style='" +
                "border-radius: 0 0 16px 16px;" +
                "margin-bottom: 20px;" +
                "'></p>");

            // 添加鼠标移入/移出事件
            codeBlock.hover(function () {
                ContentAssist.lastHoverContent = $(this);
                ContentAssist.showCopyCodeBlockButton();
                if (VLOOK.doc.newTab === false)
                    ContentAssist.showOpenInNewTabButton();
            }, function () {
                ContentAssist.hideButtons();
            });

            // 折叠长代码块
            iContentFolding.add(codeBlock);

            // 生成代码块插图题注
            CaptionGenerator.action(codeBlock);

            VLOOK.doc.counter.codeBlock++;
        });
    }

    /**
     * 复制代码块内容（不兼容 Safari）
     */
    ExtCodeBlock.copy = function () {
        VLOOK.report.push(['Interactive', 'CodeBlock', 'Copy', 0]);
        if (ContentAssist.lastHoverContent == undefined)
            return;

        // 逐行读取代码
        let code = "";
        ContentAssist.lastHoverContent.children().find(".CodeMirror-code .CodeMirror-line").each(function () {
            code += $(this).text() + "\n";
        });

        // 创建多行文本输入组件，设置内容为以上代码，并自动复制至粘贴板
        if (document.execCommand("copy")) {
            let text = document.createElement("textarea");
            text.value = code;
            document.body.appendChild(text);
            text.select();
            document.execCommand("copy", true);
            document.body.removeChild(text);

            ExtCodeBlock.showSuccess();
        }
        // 复制失败
        else {
            ExtCodeBlock.showFail();
        }
    }

    /**
     * 复制代码块内容增强版（兼容所有浏览器）
     */
    ExtCodeBlock.copyPlus = function () {
        VLOOK.report.push(['Interactive', 'CodeBlock', 'Copy', 0]);
        if (ContentAssist.lastHoverContent == undefined)
            return;

        // 逐行读取代码
        let code = "";
        ContentAssist.lastHoverContent.children().find(".CodeMirror-code .CodeMirror-line").each(function () {
            code += $(this).text() + "\n";
        });
        // 将要复制的内容赋予给 clipboard.js 指定的对象属性 data-clipboard-text
        let btnCopyClassName = ".mdx-btn-copy-code-block";
        $(btnCopyClassName).attr("data-clipboard-text", code);

        // 创建 clipboard.js 对象用于实现复制
        let clipboard = new ClipboardJS(btnCopyClassName);
        // 复制成功事件
        clipboard.on('success', function(e) {
            ExtCodeBlock.showSuccess();
            e.clearSelection();
        });
        // 复制失败事件
        clipboard.on('error', function(e) {
            ExtCodeBlock.showFail();
        });
    }

    /**
     * 显示复制成功提示
     */
    ExtCodeBlock.showSuccess = function () {
        iInfoTips.show([
            "已复制",
            "已復制",
            "Copied",
            "Copié",
            "скопированный",
            "コピー済み",
            "복사"
        ][VLOOK.lang.id], 1500, false, true);
    }

    /**
     * 显示复制失败提示
     */
    ExtCodeBlock.showFail = function () {
        iInfoTips.show([
            "非常抱歉～暂不支持在该浏览器中复制",
            "非常抱歉～暫不支持在該瀏覽器中復制",
            "I'm very sorry~ I don't support copying in this browser",
            "Je suis vraiment désolé ~ Je ne supporte pas la copie dans ce navigateur",
            "Я очень сожалею ~ Я не поддерживаю копирование в этом браузере",
            "すみません〜このブラウザでのコピーはサポートしていません",
            "죄송합니다 ~이 브라우저에서 복사를 지원하지 않습니다"
        ][VLOOK.lang.id], 3000, false, true);
    }

    // ==================== 引用块增强类 ==================== //

    function ExtQuote() {}

    /**
     * 初始化引用块以实现折叠支持
     */
    ExtQuote.init = function () {
        $("blockquote > p").each(function () {
            let target = $(this),
                next = target.next("blockquote");
            // 默认收起
            if (target.text().startWith("[+] ")
                && next.length > 0
                && next.prop("tagName").toLowerCase() === "blockquote") {
                target.next("blockquote").css("display", "none");
                target.html(target.html().replace("[+] ", "⊕ ")); // ▶
                target.attr("title", [
                    "点击展开",
                    "點擊展開",
                    "Click to expand",
                    "Cliquez pour agrandir",
                    "Нажмите, чтобы развернуть",
                    "クリックして展開",
                    "클릭하여 확장"
                ][VLOOK.lang.id]);

                target.attr("data-vk-folded", "true");
                target.addClass("mdx-blockquote-folder");
                target.css("cursor", "pointer");

                // 添加展开操作提示
                ExtQuote.appendExpandTips(target);

                // 因此处的 click 会与 $(document).unbind("click").click() 冲突
                // 所以改为 mouseup
                target.unbind("mouseup").mouseup(function () {
                    ExtQuote.toggleQuoteFolding(target);
                });
            }
            // 默认展开
            else if (target.text().startWith("[-] ")) {
                target.html(target.html().replace("[-] ", "⊖ ")); // ⊖▽
                target.attr("title", [
                    "点击收起",
                    "點擊收起",
                    "Click to fold",
                    "Cliquez pour fermer",
                    "Нажмите, чтобы закрыть",
                    "閉じる",
                    "닫기를 클릭하십시오"
                ][VLOOK.lang.id]);

                target.attr("data-vk-folded", "false");
                target.addClass("mdx-blockquote-folder");
                target.css("cursor", "pointer");

                // 因此处的 click 会与 $(document).unbind("click").click() 冲突
                // 所以改为 mouseup
                target.unbind("mouseup").mouseup(function () {
                    VLOOK.report.push(['Interactive', 'Quote', 'Fold/Unfold', 0]);
                    ExtQuote.toggleQuoteFolding(target);
                });
            }
        });
    }

    /**
     * 添加展开操作提示
     */
    ExtQuote.appendExpandTips = function (target) {
        target.append("<small>" + target.attr("title") + "</small>");
    }

    /**
     * 展开/收起引用块
     */
    ExtQuote.toggleQuoteFolding = function (target) {
        let nextQuote = target.next("blockquote");
        if (nextQuote.isHidden() === false) {
            ExtQuote.fold(target, nextQuote);
            // 添加展开提示
            ExtQuote.appendExpandTips(target);
        }
        else {
            ExtQuote.unfold(target, nextQuote);
            // 移除展开提示
            target.children("small").remove();
        }
    }

    /**
     * 收起引用块
     */
    ExtQuote.fold = function (target, nextQuote) {
        nextQuote.css("display", "none");
        target.attr("title", [
            "点击展开",
            "點擊展開",
            "Click to unfold",
            "Cliquez pour agrandir",
            "Нажмите, чтобы развернуть",
            "クリックして拡大",
            "확대하려면 클릭하십시오."
        ][VLOOK.lang.id]);
        target.attr("data-vk-folded", "true");
        target.html(target.html().replace("⊖ ", "⊕ ")); // ▽▶
    }

    /**
     * 展开引用块
     */
    ExtQuote.unfold = function (target, nextQuote) {
        nextQuote.css("display", "block");
        target.attr("title", [
            "点击收起",
            "點擊收起",
            "Click to fold",
            "Cliquez pour fermer",
            "Нажмите, чтобы закрыть",
            "閉じる",
            "닫기를 클릭하십시오"
        ][VLOOK.lang.id]);
        target.attr("data-vk-folded", "false");
        target.html(target.html().replace("⊕ ", "⊖ "));
    }

    /**
     * 自动展开引用块
     */
    ExtQuote.autoUnfold = function () {
        if (iParagraphNav.current() === undefined)
            return;

        let target = iParagraphNav.current();
        // 或目标段是引用块折叠操作区，且为未展开状态
        if (target.attr("class") !== undefined
            && target.attr("class").indexOf("mdx-blockquote-folder") !== -1
            && target.attr("data-vk-folded") === "true")
            // 模拟操作
            target.mouseup();
    }



    // ==================== 表格增强类 ==================== //

    function ExtTable() {}

    // 最后/当前显示十字光柱的表格
    ExtTable.lastCrossTable = undefined;

    // 最后/当前显示十字光柱的表格单元格
    ExtTable.lastCrossCell = undefined;

    // 表格十字光柱四条边的位置
    ExtTable.lastCrossCellPos = {};

    /**
     * 初始化表格数据
     */
    ExtTable.init = function () {
        // let VLOOK.doc.counter.table = 0;
        $("table").each(function () {
            let table = $(this);

            // 表格索引号
            table.attr("id", "data-vk-tbl-" + VLOOK.doc.counter.table);
            table.parent().attr("data-vk-container", "table");

            // 将表格的宽度比父元素要小，则调整父元素的宽度，以便在逐段导航浏览模式时的高亮效果与内容贴合
            // VLOOK.debug(table.css("width"), table.parent().css("width"));
            // if (parseInt(table.css("width")) < parseInt(table.parent().css("width")))
            //     table.parent().css("width", "fit-content");

            // 添加鼠标移入/移出事件
            table.hover(function () {
                ContentAssist.lastHoverContent = $(this);
                // 表格没有被折叠时
                if ($(this).parent().parent().attr("data-vk-folded") === "false") {
                    $(this).addClass("mdx-clickable-hover");
                    VLOOK.ui.adjustEffect($(this));
                }
                if (VLOOK.doc.newTab === false)
                    ContentAssist.showOpenInNewTabButton();
            }, function () {
                $(this).removeClass("mdx-clickable-hover");
                ContentAssist.hideButtons();
            });

            // 表格滚动事件
            table.parent().scroll(function () {
                let scrollLeft = $(this).scrollLeft();
                // 根据显示时其对应表格的水平滚动的偏移量，调整十字光柱的位置
                $("div.mdx-table-cross").each(function () {
                    $(this).css({
                        "left": ExtTable.lastCrossCellPos[$(this).attr("data-vk-direction")] - scrollLeft
                    });
                });
            });

            // 表格单元格合并
            ExtTable.cellMerge(table);

            // 表格整列格式化
            ExtTable.columnFormatting(table);

            // 折叠长表格
            iContentFolding.add(table);

            // 生成表格题注
            CaptionGenerator.action(table);

            VLOOK.doc.counter.table++;
        }); // table
    }

    /**
     * 表格单元格合并
     */
    ExtTable.cellMerge = function (table) {
        let colSpanCount = 0,
            colSpanCell,
            lastCell = null,
            tblData = [],
            tblSpan = [],
            tblTd2ThData = [],
            rowIndex = 0,
            colIndex = 0,
            needRowSpan = false;

        table.find("tr").each(function () {
            tblData[rowIndex] = [];
            tblSpan[rowIndex] = [];
            $(this).find("td, th").each(function () {
                let cell = $(this);

                // 表格单元格十字光柱处理
                ExtTable.cellCrossable(table, cell, colIndex);

                // --- 行合并预处理 ---
                // 克隆表格数据
                tblData[rowIndex][colIndex] = cell;
                tblSpan[rowIndex][colIndex] = 0;
                // 行合并标记
                if (cell.text() === "..") {
                    tblSpan[rowIndex][colIndex] = 1;
                    needRowSpan = true;
                }
                colIndex++;

                // --- 列合并 ---
                // 列合并标记
                if (cell.text() === "==") {
                    colSpanCount++;
                    cell.remove();
                    if (colSpanCount === 1)
                        colSpanCell = lastCell;
                }else { // 列合并
                    if (colSpanCount > 0) {
                        colSpanCell.attr("colspan", colSpanCount + 1);
                        colSpanCell.css("text-align", "center");
                    }
                    colSpanCount = 0;
                }
                lastCell = cell;
            }); // find(td, th)

            // 列合并（对于最后一列的补充处理）
            if (colSpanCount > 0) {
                colSpanCell.attr("colspan", colSpanCount + 1);
                colSpanCell.css("text-align", "center");
            }
            colSpanCount = 0;

            rowIndex++;
            colIndex = 0;
        }); // tr

        rowIndex = 0;

        // 行合并
        if (needRowSpan === true) {
            tblTd2ThData = [];
            // 列式遍历（从左到右）
            for (let c = 0, len = tblSpan[0].length; c < len; c++) {
                let rowSpanCount = 0,
                    rowSpanCell = null;
                let r = 0,
                    thSpanFlag = false;

                // 列式遍历（从上到下）
                while (r < tblSpan.length) {
                    if (tblSpan[r][c] === 1) { // 要合并
                        rowSpanCount++;
                        if (rowSpanCell == null) {
                            rowSpanCell = tblData[r - 1][c];
                        }
                        // 记录最大列头行合并深度
                        if (r === 1)
                            thSpanFlag = true;
                        if (thSpanFlag === true)
                            tblTd2ThData[tblTd2ThData.length] = tblData[r][c].parent();
                        tblData[r][c].remove(); // 移除要被合并的单元格
                    }else {
                        thSpanFlag = false;
                        // 单元格行合并
                        if (rowSpanCell != null) {
                            rowSpanCell.attr("rowspan", rowSpanCount + 1);
                            rowSpanCount = 0;
                            rowSpanCell = null;
                        }
                    }
                    r++;
                } // while
                // 单元格行合并（对于最后一行的补充处理）
                if (rowSpanCell != null) {
                    rowSpanCell.attr("rowspan", rowSpanCount + 1);
                    rowSpanCell.css("text-align", "center");
                }
            } // for

            for (let i = 0, len = tblTd2ThData.length; i < len; i++) {
                tblData[0][0].parent().parent().append(tblTd2ThData[i]);
            }
        } // if

        needRowSpan = false;
    }

    /**
     * 表格单元格十字光柱
     *
     * @param table 目标表格
     * @param cell 目标单元格
     * @param colIndex 列索引号
     */
    ExtTable.cellCrossable = function (table, cell, colIndex) {
        // 单元格行列索引号
        cell.attr("data-vk-tbl-col", "data-vk-tbl-" + VLOOK.doc.counter.table + "-" + colIndex);

        // 鼠标点击单元格时显示十字光柱
        cell.unbind("click").click(function () {
            VLOOK.report.push(['Interactive', 'Table', 'CellCross', 0]);

            if (table.parent().parent().attr("data-vk-folded") === "true")
                return;

            ExtTable.hideCellCross(false);
            iParagraphNav.hide();

            ExtTable.lastCrossCell = cell;
            ExtTable.lastCrossTable = table;

            let tdH = parseInt(ExtTable.lastCrossCell.css("height")),
                tdW = parseInt(ExtTable.lastCrossCell.css("width")),
                tbW = parseInt(ExtTable.lastCrossTable.css("width")),
                scrollLeft = table.parent().parent().scrollLeft();

            // 横向左边
            let crossLeft = $(".mdx-table-cross-left"),
                w = ExtTable.lastCrossCell.offset().left - ExtTable.lastCrossTable.offset().left;
                crossLeft.css({
                "top": ExtTable.lastCrossCell.offset().top,
                "left": ExtTable.lastCrossTable.offset().left,
                "height": tdH,
                "width": w,
                "z-index": 9
            });
            ExtTable.adjustCellCross(crossLeft, w, scrollLeft);

            // 横向右边
            let crossRight = $(".mdx-table-cross-right");
            w = ExtTable.lastCrossTable.offset().left + tbW - ExtTable.lastCrossCell.offset().left - tdW;
            crossRight.css({
                "top": ExtTable.lastCrossCell.offset().top,
                "left": ExtTable.lastCrossCell.offset().left + tdW,
                "height": tdH,
                "width": w,
                "z-index": 9
            });
            ExtTable.adjustCellCross(crossRight, w, scrollLeft);

            // 竖向上边
            let crossUp = $(".mdx-table-cross-up"),
                h = ExtTable.lastCrossCell.offset().top - ExtTable.lastCrossTable.offset().top;
                crossUp.css({
                "top": ExtTable.lastCrossTable.offset().top,
                "left": ExtTable.lastCrossCell.offset().left,
                "height": h,
                "width": tdW,
                "z-index": 9
            });
            ExtTable.adjustCellCross(crossUp, h, scrollLeft);

            // 竖向下边
            let crossDown = $(".mdx-table-cross-down");
            h = ExtTable.lastCrossTable.offset().top + parseInt(ExtTable.lastCrossTable.css("height")) -
                ExtTable.lastCrossCell.offset().top - tdH;
            crossDown.css({
                "top": ExtTable.lastCrossCell.offset().top + tdH,
                "left": ExtTable.lastCrossCell.offset().left,
                "height": h,
                "width": tdW,
                "z-index": 9
            });
            ExtTable.adjustCellCross(crossDown, h, scrollLeft);

            event.stopPropagation(); // 停止事件冒泡
        });
    }

    /**
     * 适配调整表格十字光柱位置、显示
     *
     * @param target 十字光柱任意边的对象实例（左/右/上/下）
     * @param limit 指定要进行隐藏判断的尺寸（宽度或高度），小于该值则不显示对应的 target
     * @param scrollLeft 表格水平滚动的偏移量
     */
    ExtTable.adjustCellCross = function (target, limit, scrollLeft) {
        if (limit < 5) // 任意边的尺寸（宽度或高度）小于最小值时隐藏
            target.hide();
        else {
            // 动画式显示
            if (VLOOK.ui.effect >= 2)
                target.velocity("fadeIn", {
                    duration: VLOOK.animate.speed
                });
            else
                target.show();
        }
        // 保存最后显示的十字光柱任意边的 left 值及水平方向上的滚动偏移量
        ExtTable.lastCrossCellPos[target.attr("data-vk-direction")] =  parseInt(target.css("left")) + scrollLeft;
    }

    /**
     * 隐藏表格十字光柱
     *
     * @param animate 隐藏的过程是否启用动画
     */
    ExtTable.hideCellCross = function (animate) {
        if (ExtTable.lastCrossCell === undefined)
            return;

        if (animate === true) {
            // 动画式显示
            if (VLOOK.ui.effect >= 2)
                $(".mdx-table-cross").velocity("fadeOut", {
                    duration: VLOOK.animate.speed
                });
            else
                $(".mdx-table-cross").hide();
        }
        else
            $(".mdx-table-cross").hide();
        ExtTable.lastCrossCell = undefined;
        ExtTable.lastCrossTable = undefined;
    }

    /**
     * 表格整列格式化
     */
    ExtTable.columnFormatting = function (table) {
        table.find("tr th").each(function () {
            // 粗体
            if ($(this).find("strong").length > 0)
                $("[data-vk-tbl-col=" + $(this).attr("data-vk-tbl-col") + "]").addClass("mdx-table-column-format-bold");
            // 斜体
            if ($(this).find("em").length > 0)
                $("[data-vk-tbl-col=" + $(this).attr("data-vk-tbl-col") + "]").addClass("mdx-table-column-format-em");
            // 下划线
            if ($(this).find("u").length > 0)
                $("[data-vk-tbl-col=" + $(this).attr("data-vk-tbl-col") + "]").addClass("mdx-table-column-format-underline");
            // 高亮
            if ($(this).find("mark").length > 0)
                $("[data-vk-tbl-col=" + $(this).attr("data-vk-tbl-col") + "]").contents().wrap("<mark></mark>");
            // 删除线
            if ($(this).find("del").length > 0)
                $("[data-vk-tbl-col=" + $(this).attr("data-vk-tbl-col") + "]").contents().wrap("<del></del>");
            // 勾选
            let text = $(this).text();
            if (/^\[.\].+/.test(text) === true) {
                $(this).prepend("<input type='checkbox' style='pointer-events: none;'/>");
                
                if (text.substr(1, 1) === "x")
                    $(this).children().attr("checked", "checked");
                
                $(this).prop("innerHTML", $(this).prop("innerHTML").replace(/\[.\]./, ""));
            }
        });
    }

    /**
     * 判断当前内容块是否与已显示了十字光柱的表格重叠
     */
    ExtTable.withCross = function (target) {
        return (ExtTable.lastCrossTable !== undefined
            && target.children().attr("id") === ExtTable.lastCrossTable.attr("id"));
    }

    // ==================== 音频增强类 ==================== //
    
    function ExtAudio() {}

    ExtAudio.icon = {
        loading : '<svg width="16px" height="16px"><use class="mdx-button-ico-light" xlink:href="#icoLoading"></use></svg>',
        play : '<svg width="16px" height="16px"><use class="mdx-button-ico-light" xlink:href="#icoPlay"></use></svg>',
        pause : '<svg width="16px" height="16px"><use class="mdx-button-ico-light" xlink:href="#icoPause"></use></svg>',
        stop : '<svg width="16px" height="16px"><use class="mdx-button-ico-light" xlink:href="#icoStop"></use></svg>',
        forbidden : '<svg width="16px" height="16px"><use class="mdx-button-ico-light" xlink:href="#icoForbidden"></use></svg>',
    }

    /**
     * 初始化音频数据
     */
    ExtAudio.init = function () {
        // 支持指定类型的音频，以及支持带参数的 URL
        $("img[src$='.mp3'],[src$='.m4a'],[src$='.ogg'],[src$='.wav'],[src*='.mp3?'],[src*='.m4a?'],[src*='.ogg?'],[src*='.wav?']").each(function () {
            let audioLike = $(this),
                audio = undefined,
                src = audioLike.attr("src");

            // 指定为 mini 模式（扩展的自定义控件）
            if (VLOOK.util.parseQueryString(src)["controls"] === "mini") {
                // 将 URL 为音频资源的 img 标签转换为 audio
                audio = ExtAudio.transToAudio(audioLike, src);
                // 设置 audio id 用于自定义 mini 控件
                audio.attr("id", "v-audio-" + VLOOK.doc.counter.audio);

                // 添加音频播放 mini 控件
                audio.after("<div id='v-audio-" + VLOOK.doc.counter.audio + "-control"
                    + "' class='mdx-audio-mini-control'></div>");

                // 开始加载音频
                audio.bind("loadstart", function () {
                    let controls = $("#" + $(this).attr("id") + "-control");
                    controls.addClass("mdx-audio-mini-control-loading");
                    controls.html(ExtAudio.icon.loading);
                });

                // 音频就绪可以开始播放
                audio.bind("canplay", function () {
                    let controls = $("#" + $(this).attr("id") + "-control"),
                        src = $(this).attr("src");

                    controls.removeClass("mdx-audio-mini-control-loading");

                    // 绑定点击事件
                    controls.unbind("click").click(function () {
                        ExtAudio.play(this, audio[0]);
                    });
                    controls.html(ExtAudio.icon.play);
                    controls.attr("v-data-pause", VLOOK.util.parseQueryString(src)["pause"]);
                    
                    // 须显示持续时长
                    if (VLOOK.util.parseQueryString(src)["duration"] === "true"
                        && audio.attr("v-display-duration") !== "true") {
                        // 计算音频时长
                        let duration = audio[0].duration,
                            min = Math.floor(duration / 60),
                            sec = Math.floor(duration -  min * 60);
                        let minStr = min > 0 ? "<strong>" + min + "</strong>′" : "";
                        audio.next().after(" <sup class='mdx-duration-info' style='color: var(--header-color)'>" + minStr + "<strong>" + sec + "</strong>″</sup>");
                        audio.attr("v-display-duration", "true");
                    }
                });

                // 正在播放
                audio.bind("playing", function () {
                    let controls = $("#" + $(this).attr("id") + "-control"),
                        pause = controls.attr("v-data-pause");

                    controls.addClass("mdx-audio-mini-control-playing");

                    // 支持暂停播放
                    if (pause !== undefined && pause === "true") {
                        controls.html(ExtAudio.icon.pause);
                    }
                    // 不支持暂停播放，暂时即结束
                    else {
                        controls.html(ExtAudio.icon.stop);
                        audio.currentTime = 0; // 播放都是从头开始
                    }
                });

                // 播放结束后恢复按钮状态
                audio.bind("ended", function () {	
                    let controls = $("#" + $(this).attr("id") + "-control");
                    controls.html(ExtAudio.icon.play);
                    controls.removeClass("mdx-audio-mini-control-playing");
                });

                // 故障或不可用
                audio.bind("emptied", function () {
                    let controls = $("#" + $(this).attr("id") + "-control");
                    // controls.text("▲");
                    controls.removeClass("mdx-audio-mini-control-loading");
                    controls.html(ExtAudio.icon.forbidden);
                    controls.removeClass("mdx-audio-mini-control");
                    controls.addClass("mdx-audio-mini-control-disabled");
                });

                // 加载错误
                audio.bind("error", function () {
                    audio.trigger("emptied");
                });
            }
            // 标准控件模式
            else {
                // 先根据插图的语法生成题注
                CaptionGenerator.actionForFigureLike(audioLike, "audio");
                
                // 将 URL 为音频资源的 img 标签转换为 audio
                audio = ExtAudio.transToAudio(audioLike, src);
                // 设置 audio 为标准控件
                audio.attr("controls", "controls");

                // 若有第 2 题注，则微调样式
                if (audio.next(".mdx-figure-caption-2").length > 0)
                    audio.css("margin-bottom", "-10px");
            }

            VLOOK.doc.counter.audio++;
        });
    }

    /**
     * 播放音频
     *
     * @param self 自定义的播放控件对象
     * @param audio 音频的 JavaScript 对象
     * @param pause 是否支持暂停播放模式，值来自于 URL 参数
     */
    ExtAudio.play = function (self, audio) {
        let controls = $(self);

        // 已暂停、未播放
        if (audio.paused === true) {
            audio.play();
        }
        // 播放中
        else {
            controls.html(ExtAudio.icon.play);
            controls.removeClass("mdx-audio-mini-control-playing");
            audio.pause();

            // 不支持暂时播放时，暂时即结束
            if (controls.attr("v-data-pause") === undefined)
                audio.currentTime = 0; // 播放都是从头开始
        }
    }

    /**
     * 转换为 audio 标签
     *
     * @param audioLike 类 audio 标签（即 src 为音频的 img 标签)
     * @param src 音频 URL
     */
    ExtAudio.transToAudio = function (audioLike, src) {
        let audio = undefined,
            tips = ["您的浏览器不支持音频标签。",
                        "您的瀏覽器不支持音頻標籤。",
                        "Your browser does not support the audio tag.",
                        "Votre navigateur ne prend pas en charge la balise audio.",
                        "Ваш браузер не поддерживает аудио тег.",
                        "お使いのブラウザは音声タグをサポートしていません。",
                        "브라우저가 오디오 태그를 지원하지 않습니다."
                    ][VLOOK.lang.id];

        // 对 audio 标签的属性进行支持
        let autoplay = VLOOK.util.parseQueryString(src)["autoplay"],
            loop = VLOOK.util.parseQueryString(src)["loop"],
            preload = VLOOK.util.parseQueryString(src)["preload"];
        
        // 将 URL 为音频资源的 img 标签转换为 audio
        audioLike.wrap("<audio src='" + src + "'>" + tips + "</audio>");
        audio = audioLike.parent();
        // 移除图片 img 标签
        audioLike.remove();

        // 设置 audio 属性
        if (autoplay !== undefined) audio.attr("autoplay", "autoplay");
        if (loop !== undefined) audio.attr("loop", "loop");
        if (preload !== undefined) audio.attr("preload", "auto");

        return audio;
    }

    // ==================== 音频增强类 ==================== //
    
    function ExtVideo() {}

    /**
     * 初始化音频数据
     */
    ExtVideo.init = function () {
        // 支持指定类型的音频，以及支持带参数的 URL
        $("img[src$='.ogv'],[src$='.mp4'],[src$='.webm'],[src*='.ogv?'],[src*='.mp4?'],[src*='.webm?']").each(function () {
            let videoLike = $(this),
                src = videoLike.attr("src");
            
            // 先根据插图的语法生成题注
            CaptionGenerator.actionForFigureLike(videoLike, "video");
                
            // 将 URL 为音频资源的 img 标签转换为 video
            ExtVideo.transToVideo(videoLike, src);

            VLOOK.doc.counter.video++;
        });
    }

    /**
     * 转换为 video 标签
     *
     * @param videoLike 类 video 标签（即 src 为视频的 img 标签)
     * @param src 视频 URL
     */
        ExtVideo.transToVideo = function (videoLike, src) {
        let video = undefined,
            tips = ["您的浏览器不支持视频标签。",
                    "您的瀏覽器不支持視頻標籤。",
                    "Your browser does not support the video tag.",
                    "Votre navigateur ne prend pas en charge le tag vidéo.",
                    "Ваш браузер не поддерживает видео тег.",
                    "お使いのブラウザは動画タグをサポートしていません。",
                    "브라우저가 비디오 태그를 지원하지 않습니다."
                ][VLOOK.lang.id];

        // 对 video 标签的属性进行支持
        let autoplay = VLOOK.util.parseQueryString(src)["autoplay"],
            loop = VLOOK.util.parseQueryString(src)["loop"],
            preload = VLOOK.util.parseQueryString(src)["preload"],
            width = VLOOK.util.parseQueryString(src)["width"],
            height = VLOOK.util.parseQueryString(src)["height"];

        // 将 URL 为音频资源的 img 标签转换为 video
        videoLike.wrap("<video src='" + src + "'>" + tips + "</video>");
        video = videoLike.parent();
        // 移除图片 img 标签
        videoLike.remove();

        // 设置 video 为标准控件
        video.attr("controls", "controls");

        // 设置 video 属性
        if (autoplay !== undefined) video.attr("autoplay", "autoplay");
        if (loop !== undefined) video.attr("loop", "loop");
        if (preload !== undefined) video.attr("preload", "auto");
        if (width !== undefined) video.attr("width", width);
        if (height !== undefined) video.attr("height", height);

        return video;
        }

    // ==================== 插图增强类 ==================== //

    function ExtFigure() {}

    /**
     * 初始化插图数据
     */
    ExtFigure.init = function () {
        let ignoreImgLost = false;
        // 针对 mermaid 饼图为双 SVG 结构（标准的 mermaid 是单 SVG 结构），进行规范化调整
        $(".md-diagram-panel > svg > svg > g").each(function () {
            $(this).unwrap();
        });

        // 对所有插图（图片、mermaid 图、插图导航的插图）进行初始化处理
        $("img, .md-diagram-panel svg, .mdx-figure-content svg").each(function () {
            let fig = $(this),
                tagName = fig.prop("tagName").toLowerCase();

            // 添加插图标识数据
            fig.attr({
                "fig-id": "mdx-figure-" + VLOOK.doc.counter.figure,
                "fig-idx": VLOOK.doc.counter.figure
            });

            // 添加插图样式
            fig.css("cursor", "pointer");
            fig.addClass("mdx-figure");

            // 添加锚点，便于在插图导航直接跳转至对应插图位置（在新标签打开时不添加））
            if (VLOOK.doc.newTab === false)
                $("<a name='" + "fig-idx" + VLOOK.doc.counter.figure + "'>").insertBefore(fig.parent());

            // 添加鼠标单击事件
            fig.unbind("click").click(function () {
                if (VLOOK.doc.newTab === false)
                    iFigureViewer.show(fig);
            });
            // 添加鼠标移入/移出事件
            fig.hover(function () {
                ContentAssist.lastHoverContent = $(this);

                if (VLOOK.doc.newTab === false) {
                    $(this).addClass("mdx-OINTable-hover");
                    ContentAssist.showOpenInNewTabButton();
                }
            }, function () {
                $(this).removeClass("mdx-OINTable-hover");
                ContentAssist.hideButtons();
            });

            // img 插图的处理
            if (tagName === "img") {
                let src = fig.attr("src"),
                    container = fig.parent();

                // 确保 img 有独立的父容器，一般情况下 Typora 导出的为 <p>
                if (container.prop("tagName").toLowerCase() !== "p") {
                    fig.wrap("<p></p>");
                    container = fig.parent();
                }
                // 为父容器增加 img 容器标识，用于折叠内容时使用
                container.attr("data-vk-container", "img");
                container.css({
                    "border-radius": "16px",
                    "margin-bottom": "20px"
                });

                // 图片无法加载时加载默认图片
                fig.bind("error", function () {
                    if (fig.attr("src").indexOf("vlook-lost-image.jpg") === -1)
                        if (ignoreImgLost === false)
                            ignoreImgLost = !confirm([
                                "图片缺失：",
                                "圖片缺失：",
                                "Lost Image: ",
                                "Image perdue: ",
                                "Потерянное изображение: ",
                                "失われた画像：",
                                "잃어버린 이미지 : "
                            ][VLOOK.lang.id] + fig.parent().text() + "\"" + fig.attr("src") + "\"" + [
                                "\n\n继续检查吗？",
                                "\n\n繼續檢查嗎？",
                                "\n\nContinue to check?",
                                "\n\nContinuer à vérifier?",
                                "\n\nПродолжить проверку?",
                                "\n\nチェックを続けますか？",
                                "\n\n계속 확인 하시겠습니까?"
                            ][VLOOK.lang.id]);

                    ExtFigure.loadDefaultOnError($(this));
                });

                // 强制重新加载一次以触发error事件
                fig.attr("src", src);

                // 处理在 Dark Mode 指定反转的图片
                if (VLOOK.util.parseQueryString(src)["invert"] === "in-dark") {
                    fig.attr("data-vk-invert", "in-dark");
                }

                // ---------- img 类长图的折叠处理 ----------
                // 创建一个Image对象，实现图片的预下载
                // var img = new Image();
                // img.src = src;

                // // 如果图片已经存在于浏览器缓存，直接处理
                // if (img.complete)
                //     iContentFolding.checkAndProcess(fig, false);
                //     // foldingLongContent(fig, false);
                // // 等待图片下载完成后再处理
                // else
                //     img.onload = function () {
                //         iContentFolding.checkAndProcess(fig, false);
                //         // foldingLongContent(fig, false);
                //     }
            } // if img
            // svg (mermaid) 插图的处理
            else if (tagName === "svg") {
                fig.parent().attr("data-vk-container", "svg");
                // iContentFolding.checkAndProcess(fig, false);
                // foldingLongContent(fig, false);
            }

            // 折叠长插图
            iContentFolding.add(fig);

            // 生成插图题注
            // generateFigureCaption(fig);
            CaptionGenerator.action(fig);

            VLOOK.doc.counter.figure++;
        });
        if (VLOOK.doc.counter.figure > 0)
            iToolbar.buttons["figure-viewer"].css("visibility", "visible");
    }

    /**
     * 加载默认图片
     *
     * @param target 目标 img 对象
     */
    ExtFigure.loadDefaultOnError = function (target) {
        target.attr({
            "src-org": target.attr("src"),
            "src": VLOOK.doc.defaultImage
        });
    }

    /**
     * 适配指定图片在 Dark Mode 的反转处理
     */
    ExtFigure.adjustImageInverInDarkMode = function () {
        let target = $("img[data-vk-invert=in-dark]");
        // 应用 Dark 模式的插图背景
        if (ColorScheme.scheme === "dark") {
            target.removeClass("mdx-figure-bg-dark");
            // Dark 模式下用 Light 背景进行反色
            target.addClass("mdx-figure-bg-light"); 
            target.addClass("mdx-img-invert-in-dark");
        }
        // 恢复Light模式插图背景
        else {
            target.removeClass("mdx-img-invert-in-dark");
        }
    }

    // ==================== Markdown 化注音语法转换为 rudy 标签 ==================== //

    function RubyTag() {}

    RubyTag.init = function () {
        console.log(document.getElementById("write").outerHTML);
        console.error("-----");
        document.getElementById("write").outerHTML = document.getElementById("write").outerHTML;
        console.log(document.getElementById("write").outerHTML);

        // $("#write").prop("outerHTML", $("#write").prop("outerHTML"));

        // $("#write").prop("outerHTML",
        //     RubyTag.buildRubyTag($("#write").prop("outerHTML")));
        // cocnsole.log(RubyTag.buildRubyTag("<div>hello<code>code</code>{注音}(zhù yīn)hello{注音}(zhù yīn)<code>code</code></div>"));
    }

    RubyTag.buildRuby = function (str) {
        return str.replace(/\{([^{}()]+)\}\(([^{}()]+)\)/g,
            function(match, $1, $2) {
                return '<ruby>' + $1 + '<rp> (</rp><rt>' + $2 + '</rt><rp>) </rp></ruby>'
        });
    }

    // ==================== 插图导航模块 ==================== //

    function FigureNav() {
        this.ui = $(".mdx-figure-nav"); // 插图导航主界面
        this.button = {
            ui : $(".mdx-btn-figure-nav"), // 所有导航按钮
            prev : $(".mdx-btn-figure-prev"), // 上一张插图按钮
            next : $(".mdx-btn-figure-next"), // 下一张插图按钮
            close : $(".mdx-btn-close-figure-viewer"), // 关闭按钮
        };
        this.content = $(".mdx-figure-content"); // 显示插图内容的控件
        this.figIndex = -1; // 当前插图索引序号，对应 fig-idx 中的值

        // 绑定各按钮事件
        let that = this;
        this.button.prev.unbind("click").click(function () {
            that.prev();
        });
        this.button.next.unbind("click").click(function () {
            that.next();
        });
        this.button.close.unbind("click").click(function () {
            that.hide();
        });

        /**
         * 插图导航导航按钮在不同终端的适配处理
         * 
         * @param flag "mobile": 移动端，"desktop"：桌面端
         */
        this.adjustHoverStyle = function (flag) {
            // 移动设备时解绑样式事件
            if (flag === "mobile") {
                this.button.prev.unbind("hover");
                this.button.next.unbind("hover");
            }
            // 非移动设备时绑定样式事件
            else {
                this.button.ui.hover(function () {
                    $(this).css({
                        "transform": "translateY(-2px)"
                    });
                    $(this).find("svg > use").addClass("mdx-btn-figure-hover");
                }, function () {
                    $(this).css({
                        "transform": "none"
                    });
                    $(this).find("svg > use").removeClass("mdx-btn-figure-hover");
                });
                // 鼠标键按下事件，模拟 :active
                this.button.ui.mousedown(function () {
                    $(this).css({
                        "transform": "none"
                    });
                    $(this).find("svg > use").addClass("mdx-btn-figure-active");
                });
                // 鼠标键释放事件，模拟恢复正常
                this.button.ui.mouseup(function () {
                    $(this).css({
                        "transform": "translateY(-2px)"
                    });
                    $(this).find("svg > use").removeClass("mdx-btn-figure-active");
                });
            }
        }

        /**
         * 显示插图导航
         */
        this.show = function (fig) {
            VLOOK.report.push(['Interactive', 'Figure Viewer', 'Show/Hide', 0]);

            VLOOK.doc.scroll.freeze();

            if (VLOOK.doc.counter.figure === 0)
                return;
            if (this.figIndex === -1)
                this.figIndex = 0;
            if (fig == null)
                fig = $("[fig-id='mdx-figure-" + this.figIndex + "']");

            this.ui.css({
                "top": this.ui.css("height")
                // "opacity": 0
            });

            ContentAssist.hideButtons();

            // 在插图导航中显示对应插图
            this.figIndex = fig.attr("fig-idx");

            this.ui.show();
            this.display();
            this.updateUI();

            // 动画式显示
            if (VLOOK.ui.effect >= 2) {
                this.ui.velocity({
                    top: 0
                }, {
                    easing: [VLOOK.animate.tension, VLOOK.animate.friction],
                    duration: VLOOK.animate.speed
                });
            } else {
                this.ui.css({
                    top: 0
                });
            }
        }

        /**
         * 关闭插图导航
         */
        this.hide = function () {
            // 动画式显示
            if (VLOOK.ui.effect >= 2) {
                this.ui.velocity({
                    top: this.ui.css("height")
                }, {
                    duration: VLOOK.animate.speed,
                    complete: function () {
                        this.content.empty();
                        this.ui.hide();
                    }
                });
            } else {
                this.ui.css({
                    top: this.ui.css("height")
                });
                this.content.empty();
                this.ui.hide();
            }

            // 调整插图动作按钮层级
            let actIdx = parseInt(ContentAssist.button.openInNewTab.css("z-index")),
                viewerIdx = parseInt(this.ui.css("z-index"));
            if (actIdx > viewerIdx)
                ContentAssist.button.openInNewTab.css("z-index", actIdx - viewerIdx);

            ContentAssist.hideButtons();
            VLOOK.doc.scroll.unfreeze();
        }

        /**
         * 显示插图内容
         */
        this.display = function () {
            let fig = $("[fig-id=mdx-figure-" + this.figIndex + "]");
            this.content.empty();
            this.content.show();
            this.content.css({
                "width": $(window).width(),
                "height": $(window).height()
            });

            let newFig = fig.clone();
            newFig.css({
                "max-width": $(window).width() - 90,
                "max-height": $(window).height() - 90,
                "display": "inline-block",
                "cursor": "pointer",
                "border-radius": "15px",
            });

            // 添加鼠标移入/移出事件
            newFig.hover(function () {
                if (VLOOK.doc.newTab === false)
                    $(this).addClass("mdx-OINTable-hover");
            }, function () {
                if (VLOOK.doc.newTab === false)
                    $(this).removeClass("mdx-OINTable-hover");
            });
            // 添加鼠标点击事件
            let that = this;
            newFig.unbind("click").click(function () {
                that.jumpTo();
                // this.hide();
            });

            this.content.append(newFig);
        }

        /**
         * 查看上一个插图
         */
        this.prev = function () {
            VLOOK.report.push(['Interactive', 'FigureNav', 'Prev', 0]);
            if (this.figIndex > 0) {
                this.figIndex--;
                ContentAssist.hideButtons();
                this.display();
                this.updateUI();
            }
        }

        /**
         * 查看下一个插图
         */
        this.next = function () {
            VLOOK.report.push(['Interactive', 'FigureNav', 'Next', 0]);
            if (this.figIndex < VLOOK.doc.counter.figure - 1) {
                this.figIndex++;
                ContentAssist.hideButtons();
                this.display();
                this.updateUI();
            }
        }

        /**
         * 更新插图导航界面
         */
        this.updateUI = function () {
            let pageNum = $(".mdx-figure-page-num");

            // 更新插图页码
            var title = [
                "(共",
                "(共",
                "(Total ",
                "(Totale ",
                "(Всего ",
                "(合計",
                "(합계"
            ][VLOOK.lang.id] + VLOOK.doc.counter.figure + [
                "张) ",
                "張) ",
                ") ",
                ") ",
                ") ",
                "張) ",
                "장) "
            ][VLOOK.lang.id];
            title += "<strong>" + $("#fig-num" + this.figIndex + " > .mdx-figure-caption-1").text() + "</strong>";
            pageNum.css("width", (this.ui.width()) - 60);
            pageNum.html(title);

            // 更新导航按钮位置
            this.button.prev.css("top", (this.ui.height() - this.button.prev.height()) / 2);
            this.button.next.css({
                "top": this.button.prev.css("top"),
                "right": "10px"
            });

            // 根据当前插图索引更新浏览按钮有效状态
            this.button.prev.css("opacity", "0");
            this.button.next.css("opacity", "0");
            if (this.figIndex > 0) {
                this.button.prev.css("opacity", "1");
            }
            if (this.figIndex < VLOOK.doc.counter.figure - 1) {
                this.button.next.css("opacity", "1");
            }
        }

        /**
         * 通过插图导航中转到文档插图位置
         */
        this.jumpTo = function () {
            let that = this;
            this.content.unbind("click").click(function () {
                // 跳转到对应位置
                window.location.href = "#fig-idx" + that.figIndex;
                // 微调位置
                let offset = (VLOOK.ui.isSmallScreen() === true) ? 100 : 60;
                $("html").scrollTop($("a[name=fig-idx" + that.figIndex + "]").offset().top - offset);
                
                that.hide();
            });
        }
    }

    // ==================== 样式重制类 ==================== //

    function Restyler() {}

    /**
     * 更新任务列表的勾选框样式
     */
    Restyler.forTaskListCheckbox = function () {
        let target = $(".md-task-list-item > input:disabled");
        target.removeAttr("disabled");
        target.css("pointer-events", "none");
    }

    /**
     * 调整默认的 mermaid 样式
     */
    Restyler.forMermaidStyle = function () {
        // 更新顺序图中的角色样式
        $(".md-diagram-panel svg[id^='mermaidChart'] > g > rect[class='actor']").each(function () {
            let target = $(this).next("text").children(), // actor rect object
                text = target.text(),
                prefix = "";
            const person = /\@.+/g, // 人物角色
                keySys = /^\*{2}.+\*{2}$/g, // 重要系统角色
                extSys = /^-{2}.+-{2}$/g; // 外部系统角色

            // 更新<人物角色>样式
            if (person.test(text) === true) {
                const h = $(this).height();
                $(this).css({
                    "rx": h / 2,
                    "ry": h / 2
                });
                $(this).addClass("actor-person");
                prefix = "☺ ";
                target.text(prefix + text.substring(1, text.length));
            }
            // 更新<重要系统角色>样式
            else if (keySys.test(text) === true) {
                // $(this).css("stroke-width", "3");
                // target.css("font-weight", "bold");
                // prefix = "⚠ ";
                target.text(prefix + text.substring(2, text.length - 2));
            }
            // 更新<外部系统角色>样式
            else if (extSys.test(text) === true) {
                $(this).css("stroke-dasharray", "5 2");
                // prefix = "◌ ";
                target.text(prefix + text.substring(2, text.length - 2));
            }
            else {
                // prefix = "△ ";
                target.text(prefix + text);
            }
        });

        // 更新顺序图中的 loop/opt 标签样式和位置，alt 为默认的样式
        $(".md-diagram-panel .labelText tspan").each(function () {
            let text = $(this),
                g = text.parent().parent();
            // 为 opt 设置的样式
            let bgColor = "var(--mermaid-accent-color5-alt)";
            let borderColor = "var(--mermaid-accent-color5)";
            let textColor = "var(--mermaid-accent-color5)";

            // 为 alt 设置样式
            if (text.text() === "alt") {
                bgColor = "var(--mermaid-accent-color4-alt)";
                borderColor = "var(--mermaid-accent-color4)";
                textColor = "var(--mermaid-accent-color4)";
            }

            // 调整 alt、opt 的样式
            if (text.text() === "alt" || text.text() === "opt") {
                // 背景色
                g.children("polygon.labelBox").css("fill", bgColor);
                // 边框色
                g.children("line.loopLine").css("stroke", borderColor);
                // 文本颜色
                g.children("text.labelText").css("fill", textColor);
                g.find("text.labelText > tspan").css("fill", textColor);
                g.find("text.loopText > tspan").css("fill", textColor);
            }

            // 将 alt(alternative)、opt(optional)、loop(loops) 翻译为其他语言
            if (text.text() === "alt")
                text.text([
                    "选择",
                    "選擇",
                    "Alt.",
                    "Alt.",
                    "Alt.",
                    "代替",
                    "대안"
                ][VLOOK.lang.id]);
            else if (text.text() === "opt")
                text.text([
                    "可选",
                    "可選",
                    "Opt.",
                    "Opt.",
                    "Opt.",
                    "ション",
                    "매칭"
                ][VLOOK.lang.id]);
            else if (text.text() === "loop")
                text.text([
                    "循环",
                    "循環",
                    "Loop.",
                    "Loop.",
                    "Loop.",
                    "ループ",
                    "루프"
                ][VLOOK.lang.id]);
        });

        // 调整 loop/opt 的标题文本
        $(".md-diagram-panel .loopText tspan").each(function () {
            // 去掉文本内容前后的中括号
            let text = $(this);
            text.text(text.text().substr(2, text.text().length - 3));

            // 调整文本的位置
            let label = text.parent().parent().find(".labelBox"),
                rect = label[0].getBBox(),
                y = parseInt(text.parent().attr("y"));
                text.parent().attr("style", "text-anchor: left");
                text.attr("x", rect.x + rect.width + 5);
            if (isNaN(y) !== true)
            text.attr("y", y + 3);
        });

        // 为兼容Firefox不支持在style中设置rx, ry，通过设置rect的rx, ry属性
        // 针对mermaid的状态图节点、子图
        $("#START rect, #END rect, #INIT ~ g > rect, .cluster rect").each(function () {
            $(this).attr({
                "rx": 15,
                "ry": 15
            });
        });

        // 修正 mermaid 的渲染 BUG
        RepairTool.fixMermaidRender();
    }

    // ==================== 第三方库修复工具类 ==================== //
    
    function RepairTool() {}

    /**
     * 【补丁】修复 Typora (0.9.9.31.5及更早的版本) 文档内链带标点符号时，导出的 HTML 后不能跳转的 BUG
     */
    RepairTool.fixTyporaInnerLink = function () {
        // 清理内链 href 中「无效」的符号，这个是目前 Typora 导出 HTML 的 BUG 引起的
        let invalidHrefSymbol = " `~!@#$%^&*()_+=[]{}\\|;:'\",.<>?/！…（【】「」、：“”，。《》？〈〉『』";
        $("a[href^='#']").each(function () {
            $(this).attr("href", $(this).attr("href").toLowerCase());
            for (let i = 0, len = invalidHrefSymbol.length; i < len; i++) {
                let href = $(this).attr("href"),
                    ch = invalidHrefSymbol.substr(i, 1);
                if ($(this).attr("href").indexOf(ch) > -1) {
                    let newStr = (i === 0) ? "-" : "";
                    $(this).attr("href", "#" + href.substring(1, href.length).replaceAll(ch, newStr));
                }
            }
        });
    }

    /**
     * 【补丁】修正 mermaid 8.4 在导出 HTML 的渲染 BUG
     */
    RepairTool.fixMermaidRender = function () {
        // 判断生成 mermaid 时 Windows 的 DPR
        let mermaidDPR = 1;
        $(".md-diagram-panel .label > g > foreignObject > div").each(function () {
            // 通过形状的标签文本的行高来判断，正常 DPR=1 下生成的一般为 16
            if (parseInt($(this).css("line-height")) > 20)
                mermaidDPR = 2;
            return false;
        });

        // 修正在 SVG 顺序图的下边界与 actor 无间隔问题（暂时已通过主题样式 .md-diagram-panel svg[viewBox^="-8 -8"] 实现）
        // $(".md-diagram-panel svg, .mdx-figure-content svg").each(function () {
            // if ($(this).find(".actor").length > 0)
            //     $(this).css("padding-bottom", "8px");
        // });

        // 修正线条粗细的样式 BUG
        $(".md-diagram-panel .edgePath > path").each(function () {
            if ($(this).attr("style").startWith("troke-width"))
                $(this).attr("style", "s" + $(this).attr("style"));
        });

        // 当前系统为 macOS，或其 DPR = 1 （默认为 Windows，其他平台未测试）
        if (env.os.macOS || env.display.DPR === 1) {
            // 调整标签文本的容器高度
            $(".md-diagram-panel .edgeLabel foreignObject").each(function () {
                let text = $(this).find("div > span");
                $(this).attr("width", parseInt(text.css("width")));
                $(this).attr("height", parseInt(text.css("height")));
            });
        }
        // 当前系统为 Windows，且其 DPR = 2
        else if (env.os.Windows && env.display.DPR === 2) {
            // 生成 mermaid 时的系统的 DPR = 1
            if (mermaidDPR === 1) {
                // 线条文本
                $(".md-diagram-panel .edgeLabel foreignObject").each(function () {
                    let text = $(this).find("div > span");
                    $(this).attr("width", parseInt(text.css("width")));
                    $(this).attr("height", parseInt(text.css("height")) * 2);
                });

                // 针对 chrome 浏览器
                if (env.browser.Chrome) {
                    // 形状文本
                    $(".md-diagram-panel .label foreignObject").each(function () {
                        let text = $(this).find("div"),
                            transform = $(this).parent();
                        // container.attr("width", parseInt(text.css("width")) * 2);
                        $(this).attr("height", parseInt(text.css("height")) * 2);
                        transform.attr("transform", RepairTool.scaleTuple(transform.attr("transform"), 1, 2));
                    });
                }
            }
            // 生成 mermaid 时的系统的 DPR = 2
            else if (mermaidDPR === 2) {
                // 线条文本
                $(".md-diagram-panel .edgeLabel .label").each(function () {
                    $(this).attr("transform", RepairTool.scaleTuple($(this).attr("transform"), 1, 0.5));
                });
            }
        }
    }

    /**
     * 按倍数调整函数元组数据，目前只支持单个函数，且只能有两个参数
     *
     * @param funcString 函数字符串，如：translate(-12,-18)
     * @param rate1 对第1个参数的调整倍数
     * @param rate2 对第2个参数的调整倍数
     */
    RepairTool.scaleTuple = function (funcString, rate1, rate2) {
        let lbIndex = funcString.indexOf("("),
            dotIndex = funcString.indexOf(","),
            rbIndex = funcString.indexOf(")");

        // 提取两个参数值
        let r1 = funcString.substring(lbIndex + 1, dotIndex),
            r2 = funcString.substring(dotIndex + 1, rbIndex);

        if (rate1 !== 1) r1 = r1 * rate1;
        if (rate2 !== 1) r2 = r2 * rate2;

        return funcString.substring(0, lbIndex + 1) +
            r1 + "," + r2 + ")";
    }

    // ==================== 多彩标签模块 ==================== //

    function ColorTag() {}

    ColorTag.styles = ["msg", "tips", "notice", "caution", "spare", "idle"];
    
    /**
     * 更新指定内容的 code 标记样式
     */
    ColorTag.init = function () {
        // 更新指定内容的<code>标签样式
        $("code").each(function () {
            let codeText = $(this).text(),
                codeTags = null,
                flag = false;

            if (codeText.length < 4)
                return true;

            // 双标签格式
            if (/^#.+\|.+#(msg|tips|notice|caution|spare|idle)?$/i.test(codeText) === true) {
                flag = true;
                ColorTag.restyleDouble($(this), codeText, ColorTag.getStyle(codeText));
            }
            // 单标签格式
            else if (/^#.+#(msg|tips|notice|caution|spare|idle)?$/i.test(codeText) === true) {
                flag = true;
                ColorTag.restyleSingle($(this), codeText, ColorTag.getStyle(codeText));
            }

            // 普通标签增加样式标识，以用于深色模式时的识别
            if (flag === false)
                $(this).addClass("mdx-std-code");
        });
    }

    /**
     * 获得代码块内容中指定类型编号
     *
     * @param codeText 目标 code 的内容
     * @param return 类型编号：1-6
     */
    ColorTag.getStyle = function (codeText) {
        if (codeText.endWith("#"))
            return 4;
        for (let i = 0, len = ColorTag.styles.length; i < len; i++) {
            if (codeText.endWith(ColorTag.styles[i]))
                return i + 1;
        }
        return 0;
    }

    /**
     * 以标签样式重新设置行内代码 code 的渲染样式（新语法）
     *
     * @param target 目标 code 对象
     * @param codeText 目标 code 的内容
     * @param type 标签样式分类编码：1-6
     */
    ColorTag.restyleSingle = function (target, codeText, type) {
            // 获得标签分类代码
        const styleCode = codeText.endWith("#") ? "" : ColorTag.styles[type - 1];
        // 过滤语法内容
        target.text(codeText.substring(1, codeText.length - styleCode.length - 1));
        target.attr("class", "mdx-tag-c" + type);
    }

    /**
     * 以双标签样式重建行内代码 code 标签结构与内容（新语法）
     *
     * @param target 目标 code 对象
     * @param codeText 目标 code 的内容
     * @param type 标签样式分类编码：1-6
     */
    ColorTag.restyleDouble = function (target, codeText, type) {
        const splitIndex = codeText.indexOf("|"),
            styleCode = codeText.endWith("#") ? "" : ColorTag.styles[type - 1];

        // 增加外容器
        target.wrap("<div style='display: inline; white-space: pre;'></div>");
        // 左标签
        target.before("<code class='mdx-tag-name" + type + "'>"
            + codeText.substring(1, splitIndex) + "</code>");
        // 右标签
        target.text(codeText.substring(splitIndex + 1, codeText.length - styleCode.length - 1));
        target.attr("class", "mdx-tag-value" + type);
    }

    /**
     * 更新多行代码块 code block/fences 样式
     *
     * 主要处理三类情况：
     * 1. span包裹标准格式全部内容。如：`= sourcecode =`
     * 2. span分别包裹标准格式的不同部分。如：(`)(=) (sourcecode) (=)(`)
     * 3. span包裹标准格式及其他所有内容。如：sourcecode`= sourcecode =`sourcecode
     */
    // ColorTag.initForCodeBlock = function () {
    //     $("span[class^='cm-']").each(function () {
    //         const reg = /`[=|\+|\*|\-|\!|#](([^`])+[a-z]|[A-Z]|[\S])+[=|\+|\*|\-|\!|#]`/g;
    //         let codeTags = ["=", "+", "*", "-", "!", "#"];
    //         let result = $(this).text().match(reg);
    //         if (result != null) {
    //             const codeText = $(this).text().substring(1, $(this).text().length - 1);
    //             for (var i = 0, len = codeTags.length; i < len; i++) {
    //                 if (codeText.length > 4 && codeText.startWith(codeTags[i] + " ") && codeText.endWith(
    //                         " " +
    //                         codeTags[i])) {
    //                     ColorTag.rebuildForCodeBlock($(this), codeTags[i] + " ", i + 1);
    //                     break;
    //                 }
    //             }
    //         }
    //     });
    // }

    /**
     * 以标签样式重新设置代码块 code block 中指定内容的渲染样式（新语法）
     *
     * @param target 目标 code block 对象
     * @param prefix 标签的标识前缀
     * @param type 标签样式分类编号：1-6
     */
    // ColorTag.rebuildForCodeBlock = function (target, prefix, type) {
    //     const codeText = target.text().substring(1, target.text().length - 1);
    //     const si = codeText.indexOf(prefix);
    //     target.text(codeText.substring(si + prefix.length, codeText.length - prefix.length));
    //     target.attr("class", "mdx-tag-c" + type);
    // }

    // ==================== 新标签打开类 ==================== //

    // ↓ ↓ ↓ ↓ ↓ 以下是属新标签中打开的页面使用  ↓ ↓ ↓ ↓ ↓

    /**
     * 针对在新标签中打开的页面进行二次初始化
     */
    function OINT() {}

    OINT.init = function () {
        $("#write").remove();
        Dom.body().append("<div id='write'></div>");
        iToolbar.ui.remove();
        iOutlineNav.ui.remove();
        iChapterNav.ui.remove();
        ContentAssist.button.openInNewTab.remove();
    }

    /**
     * 在新标签页中打开的页面中添加元素
     */
    OINT.append = function (content) {
        // Dom.body().append(content);
        $("#write").append(content);
    }

    /**
     * 更新插图的题注（用于在新标签打开插图、表格后的强制更新对应内容）
     */
    OINT.updateFigureCaption = function (type, caption1, caption2) {
        let splitIdx = caption1.indexOf(" - "),
            prefix = null,
            cap = null;

        // 存在自定义题注内容
        if (splitIdx > -1) {
            prefix = caption1.substring(0, caption1.indexOf(" - ") + 3);
            cap = caption1.substring(caption1.indexOf(" - ") + 3, caption1.length);
            $(".mdx-figure-caption > .mdx-figure-caption-1").html(prefix + "<strong>" + cap + "</strong>");
        } else
            $(".mdx-figure-caption > .mdx-figure-caption-1").html(caption1);

        if (type !== "img" && caption2 != null) {
            $(".mdx-figure-caption").append("<p class='mdx-figure-caption-2'>");
            $(".mdx-figure-caption > .mdx-figure-caption-2").text(caption2);
        }
    }

    /**
     * 完成在新标签打开页面后进行收尾处理
     */
    OINT.done = function() {
        // 设置为可滚动
        Dom.body().css({
            "overflow": "scroll"
        });
    }

    // ↑ ↑ ↑ ↑ ↑ 以上是属新标签中打开的页面使用 ↑ ↑ ↑ ↑ ↑

    // ==================== VLOOK 加载入口 ==================== // 

    /**
     * HTML文档加载完成后执行主流程
     */
    $(document).ready(function () {
        // 文档不符合 VLOOK 规范则不加载 VLOOK 插件
        if (VLOOK.checkSpecification() === false) {
            $(".mdx-load-screen").hide();
            $(".mdx-toolbar").hide();
            $(".mdx-btn").hide();
            return;
        }

        // 先隐藏，减少页面重绘
        Dom.write().css("display", "none");
        // alert(buildRuby("<div>hello<code>code</code>{注音}(zhù yīn)hello{注音}(zhù yīn)<code>code</code></div>"));

        // ----------------------------------------
        // 打蔫环境信息
        env.print();

        console.info("=== Loading VLOOK ===");

        // ----------------------------------------
        // 初始化关键组件实例
        iStopwatch.lapStart();
        console.info("- Intance");
        VLOOK.initIntance(false);
        iStopwatch.lapStop();

        // // 只支持由 Typora 导出的 HTML 文件
        // if (Dom.body().attr("class").indexOf("typora-export") === -1) {
        //     iWelcomeScreen.ui.hide();
        //     iToolbar.ui.hide();
        //     iChapterNav.ui.hide();
        //     ContentAssist.button.openInNewTab.hide();
        //     ContentAssist.button.copyCodeBlock.hide();

        //     VLOOK.report.push(['Error', 'Format', 'Not Typora Exported', ]);

        //     alert([
        //         "无法激活 VLOOK！\n目前只支持由 Typora 导出的 HTML 文件，谢谢支持！",
        //         "無法激活 VLOOK！\n目前只支持由 Typora 導出的 HTML 文件，謝謝關注！",
        //         "Unable to activate VLOOK!\nCurrently only HTML files exported by Typora are supported. Thank you for your attention!",
        //         "Impossible d'activer VLOOK!\nActuellement, seuls les fichiers HTML exportés par Typora sont pris en charge. Merci de votre attention!",
        //         "Невозможно активировать VLOOK!\nВ настоящее время поддерживаются только HTML-файлы, экспортируемые Typora. Спасибо за внимание!",
        //         "VLOOKをアクティブにできません！\n現在、TyporaによってエクスポートされたHTMLファイルのみがサポートされています。",
        //         "VLOOK를 활성화 할 수 없습니다!\n현재 Typora에서 내 보낸 HTML 파일 만 지원됩니다. 관심을 가져 주셔서 감사합니다!"
        //     ][VLOOK.lang.id]);
        //     return;
        // }

        // 推荐的浏览器类型检测
        if (env.browser.Chrome === false &&
            env.browser.Firefox === false &&
            env.browser.Safari === false) {

            VLOOK.report.push(['Error', 'Browser', navigator.userAgent, ]);

            alert([
                "为获得最佳兼容性，建议使用 Chrome / Edge / Firefox / Safari 浏览器",
                "為獲得最佳兼容性，建議使用 Chrome / Edge / Firefox / Safari / Safari 瀏覽器",
                "For best compatibility, we recommend using Chrome / Edge / Firefox / Safari",
                "Pour une meilleure compatibilité, nous vous recommandons d’utiliser Chrome / Edge / Firefox / Safari",
                "Для лучшей совместимости мы рекомендуем использовать Chrome / Edge / Firefox / Safari",
                "最高の互換性を得るために、 Chrome / Edge / Firefox / Safari の使用をお勧めします",
                "최상의 호환성을 위해 Chrome / Edge / Firefox / Safari 사용을 권장합니다."
            ][VLOOK.lang.id]);
        }

        // ----------------------------------------
        // 初始化 VLOOK Kernel
        // iStopwatch.lapStart();
        console.info("=== Init VLOOK Kernel ===");
        VLOOK.initKernel(null);

        console.info("=== Init VLOOK Misc ===");
        // ----------------------------------------
        // 因默认配色为 Light 模式
        // 若浏览器当前配色为 Dark 模式，除 CSS 的 @media (prefers-color-scheme: dark) 设置外
        // 须进行一些额外的适配
        iStopwatch.lapStart();
        console.info("- Adjust Color Scheme");
        ColorScheme.scheme = getComputedStyle(document.documentElement).getPropertyValue("--vlook-color-scheme")
            .replaceAll("\"", "").trim();
        console.info("    Color Scheme [ " + ColorScheme.scheme + " ]");
        if (ColorScheme.scheme === "dark") {
            console.warn("    Adjusting ...");
            ColorScheme.updateUI();
        }
        // 根据颜色方案对浏览器兼容性处理
        // ColorScheme.afterToggle();
        // 针对 Dark 模式进行图片反色适配处理
        ExtFigure.adjustImageInverInDarkMode();
        iStopwatch.lapStop();

        // ----------------------------------------
        // 更新欢迎屏
        iWelcomeScreen.done();

        // ----------------------------------------
        // 特效初始化
        let effect = VLOOK.util.parseQueryString(window.location.href)["effect"];
        if (effect === undefined)
            effect = "0";
        VLOOK.debug("Effect [ " + effect + " ]");
        if ("0,1,2,3".indexOf(effect) > -1) {
            VLOOK.ui.effect = parseInt(effect);
            VLOOK.ui.initEffect();
        }

        // 完成初始化后显示
        Dom.write().css("display", "block");

        // ----------------------------------------
        // 重置脚本化图表样式
        iStopwatch.lapStart();
        console.info("- Mermaid Style");
        Restyler.forMermaidStyle();
        iStopwatch.lapStop();

        // ----------------------------------------
        // Markdown 化注音语法转换为 rudy 标签 
        // iStopwatch.lapStart();
        // console.info("- Zhuyin to <ruby>");
        // RubyTag.init();
        // iStopwatch.lapStop();

        // ----------------------------------------
        // VLOOK 加载完成
        let loadTimeCost = iStopwatch.stop();
        console.info("[ DONE ]\nTOTAL TIME COST " + loadTimeCost + " ms");
        // 提交统计数据
        VLOOK.report.submit(loadTimeCost);
        VLOOK.report.push(['LoadTime', 'All', 'Times', loadTimeCost]);
    });
</script>
<!--========================================================================-->
<!--                                                                        -->
<!--                                                                        -->
<!--                              END OF VLOOK                              -->
<!--                                                                        -->
<!--                                                                        -->
<!--========================================================================-->
<div  id='write'  class = 'is-mac'><h6><a name="subvlook™subbr让你的-markdown-有了新看法br──brsup快速参考手册supbr最新版本v919idlebrbrmax丨孟兆brcopyright-©-2016-2020-max°design" class="md-header-anchor"></a><sub><span>VLOOK™</span></sub><br><span>让你的 Markdown 有了新看法</span><br><span>──</span><br><sup><span>快速参考手册</span></sup><br><code>#最新版本|V9.19#idle</code><br><br><strong><span>MAX丨孟兆</span></strong><br><em><span>COPYRIGHT © 2016-2020. MAX°DESIGN.</span></em></h6><div class='md-toc' mdtype='toc'><p class="md-toc-content" role="list"><span role="listitem" class="md-toc-item md-toc-h6" data-ref="n0"><a class="md-toc-inner" style="" href="#subvlook™subbr让你的-markdown-有了新看法br──brsup快速参考手册supbr最新版本v919idlebrbrmax丨孟兆brcopyright-©-2016-2020-max°design">VLOOK™&lt;br&gt;让你的 Markdown 有了新看法&lt;br&gt;──&lt;br&gt;快速参考手册&lt;br&gt;<code>#最新版本|V9.19#idle</code>&lt;br&gt;&lt;br&gt;<strong>MAX丨孟兆</strong>&lt;br&gt;<em>COPYRIGHT © 2016-2020. MAX°DESIGN.</em></a></span><span role="listitem" class="md-toc-item md-toc-h1" data-ref="n3"><a class="md-toc-inner" style="" href="#vlook™-是什么">VLOOK™ 是什么</a></span><span role="listitem" class="md-toc-item md-toc-h1" data-ref="n33"><a class="md-toc-inner" style="" href="#适用场景">适用场景</a></span><span role="listitem" class="md-toc-item md-toc-h1" data-ref="n48"><a class="md-toc-inner" style="" href="#特性清单">特性清单</a></span><span role="listitem" class="md-toc-item md-toc-h6" data-ref="n51"><a class="md-toc-inner" style="" href="#vlook™-特性清单环境要求vlook™-v97typora-mac版-v09931--win版-v0983">![VLOOK™ 特性清单]"环境要求：VLOOK™ V9.7+，Typora mac版 V0.9.9.31+ / Win版 V0.9.83+"</a></span><span role="listitem" class="md-toc-item md-toc-h1" data-ref="n129"><a class="md-toc-inner" style="" href="#特性介绍">特性介绍</a></span><span role="listitem" class="md-toc-item md-toc-h2" data-ref="n130"><a class="md-toc-inner" style="" href="#排版增强">排版增强</a></span><span role="listitem" class="md-toc-item md-toc-h3" data-ref="n132"><a class="md-toc-inner" style="" href="#多主题样式">多主题样式</a></span><span role="listitem" class="md-toc-item md-toc-h3" data-ref="n155"><a class="md-toc-inner" style="" href="#封面封底">封面、封底</a></span><span role="listitem" class="md-toc-item md-toc-h3" data-ref="n199"><a class="md-toc-inner" style="" href="#标题插图表格表格行自动编号">标题、插图、表格、表格行自动编号</a></span><span role="listitem" class="md-toc-item md-toc-h6" data-ref="n215"><a class="md-toc-inner" style="" href="#表格前添加-6-级标题会激活表格行的自动编号效果如下">表格前添加 6 级标题会激活表格行的自动编号，效果如下</a></span><span role="listitem" class="md-toc-item md-toc-h3" data-ref="n252"><a class="md-toc-inner" style="" href="#自动生成插图表格代码块音视频的题注">自动生成插图、表格、代码块、音/视频的题注</a></span><span role="listitem" class="md-toc-item md-toc-h3" data-ref="n284"><a class="md-toc-inner" style="" href="#表格单元格合并">表格单元格合并</a></span><span role="listitem" class="md-toc-item md-toc-h6" data-ref="n294"><a class="md-toc-inner" style="" href="#示例一单元格并列合并行合并注须使用最新版的-typora-和-vlook">![示例一：单元格并列合并、行合并]"注：须使用最新版的 Typora 和 VLOOK"</a></span><span role="listitem" class="md-toc-item md-toc-h6" data-ref="n352"><a class="md-toc-inner" style="" href="#示例二表头跨行合并1">![示例二：表头跨行合并1]</a></span><span role="listitem" class="md-toc-item md-toc-h6" data-ref="n386"><a class="md-toc-inner" style="" href="#示例三表头跨行合并2">![示例三：表头跨行合并2]</a></span><span role="listitem" class="md-toc-item md-toc-h3" data-ref="n421"><a class="md-toc-inner" style="" href="#表格列格式设置">表格列格式设置</a></span><span role="listitem" class="md-toc-item md-toc-h6" data-ref="n424"><a class="md-toc-inner" style="" href="#表格设置列格式后的混合排版效果">![表格设置列格式后的混合排版效果]</a></span><span role="listitem" class="md-toc-item md-toc-h6" data-ref="n450"><a class="md-toc-inner" style="" href="#表格设置列格式后混合排版效果格式嵌套）">![表格设置列格式后混合排版效果（格式嵌套）]</a></span><span role="listitem" class="md-toc-item md-toc-h3" data-ref="n477"><a class="md-toc-inner" style="" href="#彩虹标签">彩虹标签</a></span><span role="listitem" class="md-toc-item md-toc-h4" data-ref="n479"><a class="md-toc-inner" style="" href="#单标签风格">单标签风格</a></span><span role="listitem" class="md-toc-item md-toc-h4" data-ref="n529"><a class="md-toc-inner" style="" href="#双标签风格">双标签风格</a></span><span role="listitem" class="md-toc-item md-toc-h3" data-ref="n588"><a class="md-toc-inner" style="" href="#mermaid-样式优化">mermaid 样式优化</a></span><span role="listitem" class="md-toc-item md-toc-h6" data-ref="n606"><a class="md-toc-inner" style="" href="#mermaid-的流程图">mermaid 的流程图</a></span><span role="listitem" class="md-toc-item md-toc-h6" data-ref="n611"><a class="md-toc-inner" style="" href="#mermaid-的状态图">mermaid 的状态图</a></span><span role="listitem" class="md-toc-item md-toc-h6" data-ref="n614"><a class="md-toc-inner" style="" href="#mermaid-的顺序图">mermaid 的顺序图</a></span><span role="listitem" class="md-toc-item md-toc-h3" data-ref="n618"><a class="md-toc-inner" style="" href="#图片反色增加边缘空白">图片反色、增加边缘空白</a></span><span role="listitem" class="md-toc-item md-toc-h6" data-ref="n620"><a class="md-toc-inner" style="" href="#指定图片在-dark-模式时反色显示">指定图片在 Dark 模式时反色显示</a></span><span role="listitem" class="md-toc-item md-toc-h6" data-ref="n628"><a class="md-toc-inner" style="" href="#指定图片添加边缘空白">指定图片添加边缘空白</a></span><span role="listitem" class="md-toc-item md-toc-h3" data-ref="n644"><a class="md-toc-inner" style="" href="#统一多级列表编号">统一多级列表编号</a></span><span role="listitem" class="md-toc-item md-toc-h3" data-ref="n673"><a class="md-toc-inner" style="" href="#任务列表支持自动编号">任务列表支持自动编号</a></span><span role="listitem" class="md-toc-item md-toc-h2" data-ref="n699"><a class="md-toc-inner" style="" href="#文档导航">文档导航</a></span><span role="listitem" class="md-toc-item md-toc-h3" data-ref="n718"><a class="md-toc-inner" style="" href="#大纲导航">大纲导航</a></span><span role="listitem" class="md-toc-item md-toc-h3" data-ref="n721"><a class="md-toc-inner" style="" href="#逐章导航">逐章导航</a></span><span role="listitem" class="md-toc-item md-toc-h3" data-ref="n724"><a class="md-toc-inner" style="" href="#逐段导航">逐段导航</a></span><span role="listitem" class="md-toc-item md-toc-h3" data-ref="n743"><a class="md-toc-inner" style="" href="#插图导航">插图导航</a></span><span role="listitem" class="md-toc-item md-toc-h6" data-ref="n760"><a class="md-toc-inner" style="" href="#这是长图片示例">这是长图片示例：</a></span><span role="listitem" class="md-toc-item md-toc-h2" data-ref="n762"><a class="md-toc-inner" style="" href="#演示辅助">演示辅助</a></span><span role="listitem" class="md-toc-item md-toc-h3" data-ref="n779"><a class="md-toc-inner" style="" href="#聚光灯">聚光灯</a></span><span role="listitem" class="md-toc-item md-toc-h3" data-ref="n783"><a class="md-toc-inner" style="" href="#表格十字光柱">表格十字光柱</a></span><span role="listitem" class="md-toc-item md-toc-h3" data-ref="n787"><a class="md-toc-inner" style="" href="#在新标签打开插图表格代码块">在新标签打开插图、表格、代码块</a></span><span role="listitem" class="md-toc-item md-toc-h2" data-ref="n790"><a class="md-toc-inner" style="" href="#内容互动">内容互动</a></span><span role="listitem" class="md-toc-item md-toc-h3" data-ref="n792"><a class="md-toc-inner" style="" href="#支持音频视频">支持音频、视频</a></span><span role="listitem" class="md-toc-item md-toc-h4" data-ref="n793"><a class="md-toc-inner" style="" href="#音频">音频</a></span><span role="listitem" class="md-toc-item md-toc-h6" data-ref="n796"><a class="md-toc-inner" style="" href="#音频播放控件默认为标准模式">音频播放控件默认为：标准模式</a></span><span role="listitem" class="md-toc-item md-toc-h6" data-ref="n798"><a class="md-toc-inner" style="" href="#音频播放控件可指定为mini-模式">音频播放控件可指定为：Mini 模式</a></span><span role="listitem" class="md-toc-item md-toc-h4" data-ref="n838"><a class="md-toc-inner" style="" href="#视频">视频</a></span><span role="listitem" class="md-toc-item md-toc-h3" data-ref="n869"><a class="md-toc-inner" style="" href="#代码块增强">代码块增强</a></span><span role="listitem" class="md-toc-item md-toc-h3" data-ref="n874"><a class="md-toc-inner" style="" href="#引用内容可设置为折叠">引用内容可设置为折叠</a></span><span role="listitem" class="md-toc-item md-toc-h3" data-ref="n901"><a class="md-toc-inner" style="" href="#长内容自动折叠">长内容自动折叠</a></span><span role="listitem" class="md-toc-item md-toc-h3" data-ref="n906"><a class="md-toc-inner" style="" href="#文档内容检查与优化">文档内容检查与优化</a></span><span role="listitem" class="md-toc-item md-toc-h6" data-ref="n907"><a class="md-toc-inner" style="" href="#自动识别缺失的图片">自动识别缺失的图片</a></span><span role="listitem" class="md-toc-item md-toc-h6" data-ref="n911"><a class="md-toc-inner" style="" href="#页内链接检查">页内链接检查</a></span><span role="listitem" class="md-toc-item md-toc-h6" data-ref="n914"><a class="md-toc-inner" style="" href="#重名章节标题检查">重名章节标题检查</a></span><span role="listitem" class="md-toc-item md-toc-h6" data-ref="n918"><a class="md-toc-inner" style="" href="#外部链接强制在新标签打开">外部链接强制在新标签打开</a></span><span role="listitem" class="md-toc-item md-toc-h2" data-ref="n920"><a class="md-toc-inner" style="" href="#视觉与交互">视觉与交互</a></span><span role="listitem" class="md-toc-item md-toc-h3" data-ref="n923"><a class="md-toc-inner" style="" href="#dark-模式">Dark 模式</a></span><span role="listitem" class="md-toc-item md-toc-h3" data-ref="n927"><a class="md-toc-inner" style="" href="#字体风格选择">字体风格选择</a></span><span role="listitem" class="md-toc-item md-toc-h3" data-ref="n938"><a class="md-toc-inner" style="" href="#更友好的脚注">更友好的脚注</a></span><span role="listitem" class="md-toc-item md-toc-h3" data-ref="n942"><a class="md-toc-inner" style="" href="#更美观的公式">更美观的公式</a></span><span role="listitem" class="md-toc-item md-toc-h6" data-ref="n943"><a class="md-toc-inner" style="" href="#行内公式">行内公式</a></span><span role="listitem" class="md-toc-item md-toc-h6" data-ref="n946"><a class="md-toc-inner" style="" href="#多行公式">多行公式</a></span><span role="listitem" class="md-toc-item md-toc-h3" data-ref="n948"><a class="md-toc-inner" style="" href="#打印样式适配">打印样式适配</a></span><span role="listitem" class="md-toc-item md-toc-h3" data-ref="n950"><a class="md-toc-inner" style="" href="#快捷键操作">快捷键操作</a></span><span role="listitem" class="md-toc-item md-toc-h1" data-ref="n1005"><a class="md-toc-inner" style="" href="#打赏">打赏</a></span><span role="listitem" class="md-toc-item md-toc-h1" data-ref="n1008"><a class="md-toc-inner" style="" href="#如何使用">如何使用</a></span><span role="listitem" class="md-toc-item md-toc-h2" data-ref="n1009"><a class="md-toc-inner" style="" href="#第1步下载配置">第1步：下载、配置</a></span><span role="listitem" class="md-toc-item md-toc-h2" data-ref="n1018"><a class="md-toc-inner" style="" href="#第2步应用主题">第2步：应用主题</a></span><span role="listitem" class="md-toc-item md-toc-h2" data-ref="n1026"><a class="md-toc-inner" style="" href="#第3步植入插件">第3步：植入插件</a></span><span role="listitem" class="md-toc-item md-toc-h1" data-ref="n1041"><a class="md-toc-inner" style="" href="#许可协议">许可协议</a></span><span role="listitem" class="md-toc-item md-toc-h6" data-ref="n1047"><a class="md-toc-inner" style="" href="#the-end">The End</a></span></p></div><h1><a name="vlook™-是什么" class="md-header-anchor"></a><span>VLOOK™ 是什么</span></h1><p><code>#最新版本|V9.19#msg</code><span>    </span><code>#适用编辑器|Typora#notice</code><span>    </span><code>#开源协议|MIT#</code><span>   </span><code>#开发语言|JavaScript/HTML/CSS#spare</code><span>    </span><code>#官网|https://github.com/madmaxchow/VLOOK#tips</code></p><p><a href='https://github.com/MadMaxChow/VLOOK'><span>VLOOK™</span></a><span> 是针对由 </span><a href='https://www.typora.io'><span>Typora</span></a><sup class='md-footnote'><a href='#dfref-footnote-1' name='ref-footnote-1'>1</a></sup><span>（目前最好的跨平台 Markdown 编辑器，没有之一）导出的 HTML 文件进行增强的插件。</span></p><p><span>VLOOK™ 也许是目前最好的 Markdown 增强插件之一，也是</span><strong><span>开源中国（</span><a href='https://www.oschina.net/p/vlook'><span>OSChina.net</span></a><span>）推荐的国产开源产品。</span></strong></p><p><span>VLOOK™ 属于开源软件，遵从 </span><strong><a href='#许可协议'><span>MIT 许可证</span></a></strong><span>。</span></p><blockquote><p><span>[+] </span><strong><span>VLOOK™ 许可协议</span></strong></p><blockquote><p><strong><span>MIT许可证</span></strong></p><p><span>版权所有 (c) 2018-2020 MAX°DESIGN | Max Chow</span></p><p><span>在此授予任何获得此软件和相关文档文件（“软件”）副本的人免费许可，以无限制地处理本软件，包括但不限于使用，复制，修改，合并，发布，分发，再授权和/或出售本软件的副本，并允许本软件的授予人员遵从以下情况：</span></p><p><span>上述版权声明和本许可声明应包含在本软件的所有副本或重要部分中。</span></p><p><span>本软件按“原样”提供，不提供任何以表达或暗示，包括但不限于销售，适用于特定用途和不侵权的保证。在任何情况下，作者或版权所有人不对因软件或软件的使用或其他事宜产生的任何索赔，损害或其他责任（无论是在合同，侵权或其他方面的诉讼中）负责。</span></p></blockquote><p><span>[+] </span><strong><span>Markdown 是什么？</span></strong></p><blockquote><ul><li><span>2004年，</span><a href='https://en.wikipedia.org/wiki/John_Gruber'><span>John Gruber</span></a><span> 创造了 </span><a href='https://en.wikipedia.org/wiki/Markdown'><span>Markdown</span></a><span>，一种专门针对网络写作的</span><code>文本标记语言</code><span>。使用 Markdown，你只需在写作过程中插入少量的标记符号，就能很轻松地进行排版（例如设置标题、加粗、列表、引用等）。</span></li><li><span>Markdown文档以</span><code>纯文本格式存储</code><span>，这意味着，它们可以用几乎任一种文本编辑器打开。同时，又能通过 Markdown 编辑器导出为带排版的富文本文档、HTML 网页等等。纯粹、简洁、易用、灵活，都是人们喜欢 Markdown 的原因。</span></li><li><span>目前 Markdown 的标准化项目是 </span><a href='http://commonmark.org'><span>CommonMark</span></a><span>。</span></li></ul></blockquote><p><span>[+] </span><strong><span>60 秒学会、10 分钟深入学习 Markdown 语法：</span></strong></p><blockquote><ol start='' ><li><span>标准化 </span><strong><span>CommonMark</span></strong><span> 语法参考：</span><a href='http://commonmark.org/help/'><span>60秒学会 Markdown 语法</span></a><span>、</span><a href='http://commonmark.org/help/tutorial/'><span>10 分钟深入学习 Markdown</span></a></li><li><span>GitHub 采用 </span><strong><span>Flavored Markdown</span></strong><span> 的语法参考：Typora 目前采用该标准  </span><a href='https://support.typora.io/Markdown-Reference/'><span>详细</span></a></li></ol></blockquote></blockquote><h1><a name="适用场景" class="md-header-anchor"></a><span>适用场景</span></h1><p><strong><span>如果你也有以下一个或多个需求或痛点，就可以放心地尝试基于 Markdown 的解决方案（如 Typora + VLOOK）进行文档的编辑、发布、管理：</span></strong></p><ul><li><span>团队或项目的文档须统一模板化排版与输出，并能随时切换不同模板</span></li><li><span>只关注文档内容，排版工作希望能自动化完成</span></li><li><span>以网络作为主要的发布渠道，主要发布为 HTML 格式，同时能发布为 PDF 等其它常用格式</span></li><li><span>减少在文档（如 Word）、制图（如 Visio）等软件工具方面的购买支出</span></li><li><span>需要支持跨平台（Windows / macOS / Linux 等）进行文档的编辑的与输出的软件工具</span></li><li><span>文档排版、交互、个性化主题等功能方面，具备可持续升级的能力和开放性</span></li></ul><h1><a name="特性清单" class="md-header-anchor"></a><span>特性清单</span></h1><p><span>VLOOK™ 充分挖掘和扩展了 Markdown 和 Typora 的语法和功能，并结合现代网络化的文档编辑和出版中涉及的文档的 </span><strong><span>格式排版</span></strong><span>、</span><strong><span>文档导航</span></strong><span>、</span><strong><span>演示辅助</span></strong><span>、</span><strong><span>内容交互</span></strong><span> 等方面的需求，为你提供基于 Markdown 的文档编辑、文档发布、文档阅读者提供 </span><strong><span>一致</span></strong><span>、</span><strong><span>简洁</span></strong><span>、</span><strong><span>友好</span></strong><span> 的体验。</span></p><p><code>#提示#tips</code><span> </span><strong><span>你正在浏览在这个网页就是由 Typora 编辑并植入 VLOOK™ 插件所生成，并应用了 VLOOK™ 的所有的特性</span></strong></p><h6><a name="vlook™-特性清单环境要求vlook™-v97typora-mac版-v09931--win版-v0983" class="md-header-anchor"></a><span>![VLOOK™ 特性清单]&quot;环境要求：VLOOK™ V9.7+，Typora mac版 V0.9.9.31+ / Win版 V0.9.83+&quot;</span></h6><figure><table><thead><tr><th><span>VLOOK™ 的特性及简介</span></th></tr></thead><tbody><tr><td><mark><strong><span>一、排版增强　　　　　　　　　　　　　　　</span></strong></mark></td></tr><tr><td><strong><a href='#封面封底'><span>封面、封底</span></a></strong><br><span>配合主题样式，让你用 Markdown 写的文档也能焕发专业气质</span></td></tr><tr><td><strong><a href='#多主题样式'><span>多主题样式</span></a></strong><br><span>让你的文档尽显个性，同时提供主题定制服务</span></td></tr><tr><td><strong><a href='#标题插图表格表格行自动编号'><span>标题、插图、表格、表格行支持自动编号</span></a></strong><br><span>“0”配置，跟 Word 说 ByeBye 吧～</span></td></tr><tr><td><strong><a href='#自动生成插图表格代码块音视频的题注'><span>自动生成插图、表格、代码块、音/视频的题注</span></a></strong><br><span>OMG！配合插图、表格、代码块、音/视频的自动编号，高效高颜值！还有独特的双题注～</span></td></tr><tr><td><strong><a href='#表格单元格合并'><span>表格单元格合并</span></a></strong><br><span>这个是用 Markdown 人的真痛点，在这时为你提供了优雅的解决方法</span></td></tr><tr><td><strong><a href='#表格列格式设置'><span>表格列格式设置</span></a></strong><br><span>Markdown 的表格也能快速设置列的格式（如加粗、高亮、斜体、下划线），同样为你提供了优雅的解决方法</span></td></tr><tr><td><strong><a href='#彩虹标签'><span>彩虹标签</span></a></strong><br><span>可自定义多个配色的标签、双标签，让你的 Markdown 文档排版更专业、更标准化</span></td></tr><tr><td><strong><a href='#mermaid-样式优化'><span>mermaid 样式优化</span></a></strong><br><span>全面深度优化 mermaid 图表，并提供补丁修正其跨平台的兼容性问题</span></td></tr><tr><td><strong><a href='#图片反色增加边缘空白'><span>图片反色、增加边缘空白</span></a></strong><br><span>可指定在 Dark 模式时反色，还能增加边缘空白，让图片的呈现更和谐、阅读体验更佳</span></td></tr><tr><td><strong><a href='#统一多级列表编号'><span>统一多级列表自动编号</span></a></strong><br><span>将多级有序、无序列表的编号进行了统一，以更聚焦内容的结构化</span></td></tr><tr><td><strong><a href='#任务列表支持自动编号'><span>任务列表支持自动编号</span></a></strong><br><span>让任务列表和多级列表的自动编号两者兼得</span></td></tr><tr><td><mark><strong><span>二、文档导航　　　　　　　　　　　　　　　</span></strong></mark></td></tr><tr><td><strong><a href='#大纲导航'><span>大纲导航</span></a></strong><br><span>最为熟悉和常用的文档导航方式，支持折叠</span></td></tr><tr><td><strong><a href='#逐章导航'><span>逐章导航</span></a></strong><br><span>在长文档中特别好用，随时眯一眼就知道当前章节、上/下章节是什么了</span></td></tr><tr><td><strong><a href='#逐段导航'><span>逐段导航</span></a></strong><br><span>这个很 GEEK，可以通过键盘按文档的逐段进行浏览，习惯用 VI / VIM 的人应该会欢呼！</span></td></tr><tr><td><strong><a href='#插图导航'><span>插图导航</span></a></strong><br><span>让你快速在快速浏览文档的所有插图，并能直接跳到文档中对应的位置</span></td></tr><tr><td><mark><strong><span>三、演示辅助　　　　　　　　　　　　　　　</span></strong></mark></td></tr><tr><td><strong><a href='#聚光灯'><span>聚光灯</span></a></strong><br><span>太COOL了！在投影时可以让大家快速聚焦在关键内容上了</span></td></tr><tr><td><strong><a href='#表格十字光柱'><span>表格十字光柱</span></a></strong><br><span>方便你与大家讨论长表格、大表格时，快速聚焦指定单元格，及对应的行和列</span></td></tr><tr><td><strong><a href='#在新标签打开插图表格代码块'><span>在新标签打开插图、表格、代码块</span></a></strong><br><span>在长文档中的来回翻页查看插图、表格、代码示例是很崩溃的事，现在你可以让它们在浏览器的不同标签中显示了</span></td></tr><tr><td><mark><strong><span>四、内容互动　　　　　　　　　　　　　　　</span></strong></mark></td></tr><tr><td><strong><a href='#支持音频视频'><span>支持音频、视频</span></a></strong><br><span>你的 Markdown 文档从此可以看视频、听音频了，音频还支持迷你模式，应用的潜力等你来发挥～</span></td></tr><tr><td><strong><a href='#代码块增强'><span>代码块增强</span></a></strong><br><span>在这你会发现连闷骚的代码都透着动感，高亮当行、复制～</span></td></tr><tr><td><strong><a href='#引用内容可设置为折叠'><span>引用内容可设置为折叠</span></a></strong><br><span>引用内容很长很多？现在可以指定是否默认收起，读者点击才展示引用内容……在 VLOOK™ 的加持下，这里都不是事</span></td></tr><tr><td><strong><a href='#长内容自动折叠'><span>长内容自动折叠</span></a></strong><br><span>长图、长表格、长代码会占用太多屏幕空间？现在可以统统自动折叠，静待你的二维展开指令</span></td></tr><tr><td><strong><a href='#文档内容检查与优化'><span>文档内容检查与优化</span></a></strong><br><span>文档中的页内链接、图片链接失效了，现在 VLOOK™ 会悄悄告诉你的</span></td></tr><tr><td><strong><a href='#更友好的脚注'><span>更友好的脚注</span></a></strong><br><span>用 Markdown 也可以像 Kindle 那样以弹窗方式来看脚注</span></td></tr><tr><td><mark><strong><span>五、视觉与交互　　　　　　　　　　　　　　　</span></strong></mark></td></tr><tr><td><strong><a href='#dark-模式'><span>Dark 模式</span></a></strong><br><span>这个不用多说了，懂的人都会喜欢。也可手动切换回标准的 Light 模式</span></td></tr><tr><td><strong><a href='#字体风格选择'><span>字体风格选择</span></a></strong><br><span>AMAZING! 不同的字体风格为你的文档带来不同的调性～</span></td></tr><tr><td><strong><a href='#更美观的公式'><span>更美观的公式</span></a></strong><br><span>让你的各种公式长得与 VLOOK™ 的不同主题更搭</span></td></tr><tr><td><strong><a href='#打印样式适配'><span>打印样式适配</span></a></strong><br><span>使用 VLOOK™ 提供的打印功能，确保文档样式适合商务办公场景下的打印输出</span></td></tr><tr><td><strong><a href='#快捷键操作'><span>快捷键操作</span></a></strong><br><span>支持键盘快捷键操作，又可以再装个逼了～</span></td></tr><tr><td><strong><span>跨平台支持</span></strong><br><span>能自适应在 PC 、平板、手机上进行浏览</span></td></tr><tr><td><strong><span>自动识别链接类型</span></strong><br><span>自动识别对文档的内部链接、外部链接，鼠标在链接上悬停时通过不同的角标图示进行区分</span></td></tr><tr><td><strong><span>七语种界面</span></strong><br><span>界面提示说明、题注前缀等内容，均支持：</span><strong><span>简/繁/英/法/俄/日/韩</span></strong><span>（依赖于浏览器的当前语言设置）</span></td></tr></tbody></table></figure><h1><a name="特性介绍" class="md-header-anchor"></a><span>特性介绍</span></h1><h2><a name="排版增强" class="md-header-anchor"></a><span>排版增强</span></h2><p><strong><span>有了 VLOOK™ 主题及插件的支持，让你对 Markdown 编辑器（暂只支持 Typora）的自动化排版能力有了全新的理解。</span></strong></p><h3><a name="多主题样式" class="md-header-anchor"></a><span>多主题样式</span></h3><p><span>VLOOK™ 已为你内置了多套原创、独具风格的主题样式</span><sup class='md-footnote'><a href='#dfref-footnote-2' name='ref-footnote-2'>2</a></sup><span>，能满足日常大多不同的应用场景和视觉偏好：</span></p><ul><li><strong><span>Hope 海洋之心</span></strong><span>：</span><a href='https://madmaxchow.github.io/VLOOK/theme-hope.html'><span>预览 ＞</span></a></li><li><strong><span>Joint 榫卯</span></strong><span>：</span><a href='https://madmaxchow.github.io/VLOOK/theme-joint.html'><span>预览 ＞</span></a></li><li><strong><span>Geek 极邃</span></strong><span>：</span><a href='https://madmaxchow.github.io/VLOOK/theme-geek.html'><span>预览 ＞</span></a></li><li><strong><span>Fancy 慕幻</span></strong><span>：</span><a href='https://madmaxchow.github.io/VLOOK/theme-fancy.html'><span>预览 ＞</span></a></li><li><strong><span>Thinking 静思</span></strong><span>：</span><a href='https://madmaxchow.github.io/VLOOK/theme-thinking.html'><span>预览 ＞</span></a></li></ul><p><img src="https://s1.ax1x.com/2020/06/12/tOlcqO.png" referrerpolicy="no-referrer" alt="内置高颜值实用的主题" title="可自定义扩展更多样式"></p><blockquote><p><span>[+] </span><strong><span>我要怎样才能使用这些内置的主题？</span></strong></p><blockquote><p><span>下载并添加主题文件（vlook-*.css）到 Typora 主题目录后，在导出 HTML 前通过 Typora 的「主题」菜单选择以「VLOOK」为前缀的主题，如：</span><strong><span>VLOOK™ hope</span></strong></p><p><span>── 更多使用指引详见《</span><a href='#如何使用'><span>如何使用</span></a><span>》</span></p></blockquote></blockquote><p>&nbsp;</p><p><code>#私人定制#</code><span>目前 VLOOK™ 项目也现已开放了主题的 </span><strong><span>私人定制</span></strong><span> 服务（</span><code>#微信|MaxChow#tips</code><span>），定制样品示例如下：</span></p><p><img src="https://s1.ax1x.com/2020/06/12/tOl2ZD.png" referrerpolicy="no-referrer" alt="私人定制主题" title="以上仅为私人定制的样品参考示例，非正式定制服务成品"></p><h3><a name="封面封底" class="md-header-anchor"></a><span>封面、封底</span></h3><p><span>应用了 VLOOK™ 的主题后，即可通过 Markdown 的标准语法（须按 VLOOK™ 约定的使用规范）即可激活对应主题的封面、封底。</span></p><blockquote><p><span>[+] </span><strong><span>这样就能激活封面！</span></strong></p><blockquote><p><span>在文档的最开始输入一个 6 级标题</span><code>###### 这是封面标题</code><span>即可激活，同时已内置对特定类型信息的自动排版，具体如下：</span></p><p><span>[+] </span><strong><span>标题</span></strong></p><blockquote><ul><li><p><span>默认格式就是标题格式，直接输入就可以了；</span></p></li><li><p><span>可结合 HTML 的上标、下标方式进行大标题、小标题的延伸应用：</span></p><ul><li><span>上标：</span><code>&lt;sup&gt;上标内容&lt;/sup&gt;</code></li><li><span>下标：</span><code>&lt;sub&gt;下标内容&lt;/sub&gt;</code></li></ul></li></ul></blockquote><p><span>[+] </span><strong><span>文档类型、密级</span></strong></p><blockquote><p><span>可使用 VLOOK™ 的</span><a href='#双标签风格'><span>双标签风格</span></a><span>写法来实现，举例：</span></p><ul><li><code>`#文档密级|对外公开#tips`</code></li><li><code>`#文档密级|内部公开#notice`</code></li><li><code>`#文档密级|机密资料#caution`</code></li></ul></blockquote><p><span>[+] </span><strong><span>作者</span></strong></p><blockquote><p><span>使用 Markdown 的「粗体」格式标记出「作者信息」即可（会自动添加前缀「by」、加粗），举例：</span><code>**我是作者**</code></p></blockquote><p><span>[+] </span><strong><span>版权信息</span></strong></p><blockquote><p><span>使用 Markdown 的「斜体」格式标记出「版权信息」即可（会自动缩小字号、加粗），举例：</span><code>*(C)2020. 版权所有*</code></p></blockquote></blockquote></blockquote><p><span>以下是本文档封面的完整 Markdown 语法示例内容：</span></p><pre spellcheck="false" class="md-fences md-end-block md-fences-with-lineno ty-contain-cm modeLoaded" lang="markdown"><div class="CodeMirror cm-s-inner CodeMirror-wrap" lang="markdown"><div style="overflow: hidden; position: relative; width: 3px; height: 0px; top: 0px; left: 38px;"><textarea autocorrect="off" autocapitalize="off" spellcheck="false" tabindex="0" style="position: absolute; bottom: -1em; padding: 0px; width: 1000px; height: 1em; outline: none;"></textarea></div><div class="CodeMirror-scrollbar-filler" cm-not-content="true"></div><div class="CodeMirror-gutter-filler" cm-not-content="true"></div><div class="CodeMirror-scroll" tabindex="-1"><div class="CodeMirror-sizer" style="margin-left: 28px; margin-bottom: 0px; border-right-width: 0px; padding-right: 0px; padding-bottom: 0px;"><div style="position: relative; top: 0px;"><div class="CodeMirror-lines" role="presentation"><div role="presentation" style="position: relative; outline: none;"><div class="CodeMirror-measure"><div class="CodeMirror-linenumber CodeMirror-gutter-elt"><div>1</div></div></div><div class="CodeMirror-measure"></div><div style="position: relative; z-index: 1;"></div><div class="CodeMirror-code" role="presentation"><div class="CodeMirror-activeline" style="position: relative;"><div class="CodeMirror-activeline-background CodeMirror-linebackground"></div><div class="CodeMirror-gutter-background CodeMirror-activeline-gutter" style="left: -28px; width: 28px;"></div><div class="CodeMirror-gutter-wrapper CodeMirror-activeline-gutter" style="left: -28px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt CodeMirror-linenumber-show" style="left: 0px; width: 19px;">1</div></div><pre class=" cm-header cm-header6 CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class=" cm-header cm-header6">###### </span><span class="cm-tag cm-bracket">&lt;</span><span class="cm-tag">sup</span><span class="cm-tag cm-bracket">&gt;</span><span class=" cm-header cm-header6">VLOOK™</span><span class="cm-tag">&lt;/sup&gt;</span><span class="cm-tag cm-bracket">&lt;</span><span class="cm-tag">br</span><span class="cm-tag cm-bracket">&gt;</span><span class=" cm-header cm-header6">让你的 Markdown 有了新看法</span><span class="cm-tag cm-bracket">&lt;</span><span class="cm-tag">br</span><span class="cm-tag cm-bracket">&gt;</span><span class=" cm-header cm-header6">──</span><span class="cm-tag cm-bracket">&lt;</span><span class="cm-tag">br</span><span class="cm-tag cm-bracket">&gt;&lt;</span><span class="cm-tag">sub</span><span class="cm-tag cm-bracket">&gt;</span><span class=" cm-header cm-header6">快速参考手册</span><span class="cm-tag">&lt;/sub&gt;</span><span class="cm-tag cm-bracket">&lt;</span><span class="cm-tag">br</span><span class="cm-tag cm-bracket">&gt;&lt;</span><span class="cm-tag">br</span><span class="cm-tag cm-bracket">&gt;&lt;</span><span class="cm-tag">br</span><span class="cm-tag cm-bracket">&gt;&lt;</span><span class="cm-tag">br</span><span class="cm-tag cm-bracket">&gt;</span><span class=" cm-strong cm-header cm-header6">**MAX丨孟兆**</span><span class="cm-tag cm-bracket">&lt;</span><span class="cm-tag">br</span><span class="cm-tag cm-bracket">&gt;</span><span class=" cm-em cm-header cm-header6">*COPYRIGHT © 2016-2020. MAX°DESIGN.*</span></span></pre></div></div></div></div></div></div><div style="position: absolute; height: 0px; width: 1px; border-bottom-width: 0px; border-bottom-style: solid; border-bottom-color: transparent; top: 28px;"></div><div class="CodeMirror-gutters" style="height: 28px; left: 0px;"><div class="CodeMirror-gutter CodeMirror-linenumbers" style="width: 27px;"></div></div></div></div></pre><p><code>#提示#tips</code><span> </span><strong><span>封面内如何换行？</span></strong><span> 可直接输入 HTML 的换行标签</span><code>&lt;br&gt;</code><span>即可，或直接使用快捷键 </span><kbd><span>Shift</span></kbd><span> + </span><kbd><span>ENTER ↵</span></kbd></p><blockquote><p><span>[+] </span><strong><span>这样就能激活封底！</span></strong></p><blockquote><p><span>在文档的最末处输入一个 6 级标题</span><code>###### 这是封底结语</code><span>即可激活，同时已内置对特定类型信息的自动排版。</span></p></blockquote></blockquote><p><span>以下是本文档封底的完整 Markdown 语法示例内容：</span></p><pre spellcheck="false" class="md-fences md-end-block md-fences-with-lineno ty-contain-cm modeLoaded" lang="markdown"><div class="CodeMirror cm-s-inner CodeMirror-wrap" lang="markdown"><div style="overflow: hidden; position: relative; width: 3px; height: 0px; top: 0px; left: 38px;"><textarea autocorrect="off" autocapitalize="off" spellcheck="false" tabindex="0" style="position: absolute; bottom: -1em; padding: 0px; width: 1000px; height: 1em; outline: none;"></textarea></div><div class="CodeMirror-scrollbar-filler" cm-not-content="true"></div><div class="CodeMirror-gutter-filler" cm-not-content="true"></div><div class="CodeMirror-scroll" tabindex="-1"><div class="CodeMirror-sizer" style="margin-left: 28px; margin-bottom: 0px; border-right-width: 0px; padding-right: 0px; padding-bottom: 0px;"><div style="position: relative; top: 0px;"><div class="CodeMirror-lines" role="presentation"><div role="presentation" style="position: relative; outline: none;"><div class="CodeMirror-measure"><div class="CodeMirror-linenumber CodeMirror-gutter-elt"><div>1</div></div></div><div class="CodeMirror-measure"></div><div style="position: relative; z-index: 1;"></div><div class="CodeMirror-code" role="presentation"><div class="CodeMirror-activeline" style="position: relative;"><div class="CodeMirror-activeline-background CodeMirror-linebackground"></div><div class="CodeMirror-gutter-background CodeMirror-activeline-gutter" style="left: -28px; width: 28px;"></div><div class="CodeMirror-gutter-wrapper CodeMirror-activeline-gutter" style="left: -28px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt CodeMirror-linenumber-show" style="left: 0px; width: 19px;">1</div></div><pre class=" cm-header cm-header6 CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class=" cm-header cm-header6">###### The End</span></span></pre></div></div></div></div></div></div><div style="position: absolute; height: 0px; width: 1px; border-bottom-width: 0px; border-bottom-style: solid; border-bottom-color: transparent; top: 28px;"></div><div class="CodeMirror-gutters" style="height: 28px; left: 0px;"><div class="CodeMirror-gutter CodeMirror-linenumbers" style="width: 27px;"></div></div></div></div></pre><p><strong><span>~ SO EASY!</span></strong></p><h3><a name="标题插图表格表格行自动编号" class="md-header-anchor"></a><span>标题、插图、表格、表格行自动编号</span></h3><p><span>如果你使用过 Word 的标题、图表的自动编码功能，就会惊喜地发现，基于 Markdown 也能做到，甚至能做得更好～</span><br><span>既不需要进行额外的设置和语法支持，甚至还能对表格行进行自动行号编号，一起来看看吧。</span></p><blockquote><p><span>[+] </span><strong><span>标题自动编号</span></strong></p><blockquote><p><span>所有 VLOOK™ 的主题都会自动对 </span><code>1 ~ 5级</code><span> 标题进行自动编号；</span></p><p><span>编号的格式就是你在本文各级章节标题所看到的那样；</span></p><p><span>因为</span><code>6级</code><span> 标题在 VLOOK™ 中应用于</span><a href='#封面封底'><span>封面和封底</span></a><span>、段落小标题的排版等，所以不在自动编号范围内。</span></p></blockquote><p><span>[+] </span><strong><span>插图自动编号</span></strong></p><blockquote><p><span>支持对文档内所有的插图，包括图片、mermaid 图表进行统一的自动编号，编号格式为：</span><code>图 XX</code><span>；</span></p><p><span>正如你在前面看到的那些介绍</span><a href='#多主题样式'><span>内置主题</span></a><span>的图片那样。</span></p></blockquote><p><span>[+] </span><strong><span>表格、表格行自动编号</span></strong></p><blockquote><p><span>支持对文档内所有表格进行统一的自动编号，编号格式为：</span><code>表 XX</code><span>；</span></p><p><span>要激活</span><strong><span>表格行</span></strong><span>的自动编号，须在表格前添加任意层级的标题，或为有序 /  无序列表下的缩进表格，如：</span><code>###### 这是一个表格</code></p></blockquote></blockquote><h6><a name="表格前添加-6-级标题会激活表格行的自动编号效果如下" class="md-header-anchor"></a><span>表格前添加 6 级标题会激活表格行的自动编号，效果如下</span></h6><figure><table><thead><tr><th><span>列1</span></th><th><span>列2</span></th><th style='text-align:center;' ><span>列3</span></th><th style='text-align:right;' ><span>列4</span></th></tr></thead><tbody><tr><td><span>第一行</span></td><td><span>左对齐（长内容）</span></td><td style='text-align:center;' ><span>居中对齐</span></td><td style='text-align:right;' ><span>右对齐（长内容）</span></td></tr><tr><td><span>第二行（长内容）</span></td><td><span>左对齐</span></td><td style='text-align:center;' ><span>居中对齐（长内容）</span></td><td style='text-align:right;' ><span>右对齐</span></td></tr></tbody></table></figure><ul><li><p><strong><span>有序 / 无序列表下的缩进表格，会激活表格行的自动编号，效果如下：</span></strong></p><figure><table><thead><tr><th><span>列1</span></th><th><span>列2</span></th><th style='text-align:center;' ><span>列3</span></th><th style='text-align:right;' ><span>列4</span></th></tr></thead><tbody><tr><td><span>第一行</span></td><td><span>左对齐（长内容）</span></td><td style='text-align:center;' ><span>居中对齐</span></td><td style='text-align:right;' ><span>右对齐（长内容）</span></td></tr><tr><td><span>第二行（长内容）</span></td><td><span>左对齐</span></td><td style='text-align:center;' ><span>居中对齐（长内容）</span></td><td style='text-align:right;' ><span>右对齐</span></td></tr></tbody></table></figure></li></ul><p><code>#提示#tips</code><span>听说你还想给插图、表格添加题注？好消息是 VLOOK™ 也支持，接着看就能又甩你一个新技能～</span></p><h3><a name="自动生成插图表格代码块音视频的题注" class="md-header-anchor"></a><span>自动生成插图、表格、代码块、音/视频的题注</span></h3><p><span>你只需要按 GFM 添加图片的 Markdown 语法，VLOOK™ 就会自动为你的图片添加图注。</span><br><span>如果你要为表格、mermaid 图表，甚至还要同时支持两个题注，这些都可以使用 VLOOK™ 扩展的类似添加图片的语法就能轻松实现～</span></p><blockquote><p><span>[+] </span><strong><span>这样做，你就能为图片自动生成题注</span></strong></p><blockquote><p><span>以 GFM 添加图片的 Markdown 语法为基础：</span><code>![图片标题](图片URL &quot;可选子标题&quot;)</code></p><ul><li><strong><span>图片标题：</span></strong><span>即为默认题注，如：</span><code>![这是图片的默认题注](图片URL)</code></li><li><strong><span>可选子标题：</span></strong><span>若填写了可选子标题，该可选子标题就会自动生成为第 2 题注，如：</span><code>![这是图片的默认题注](这是图片的第2题注)</code><span>。</span></li></ul><p><code>#注意#</code><span>以上语法中的「可选子标题」与「图片URL」间须以英文空格 </span><kbd><span>   SPACE   </span></kbd><span> 进行分隔</span></p></blockquote><p><span>[+] </span><strong><span>这样做，也能为表格、mermaid 图表、代码块添加题注</span></strong></p><blockquote><ul><li><p><strong><span>懒人方案：</span></strong></p><ul><li><span>在表格、mermaid 图表、代码块前直接编写题注内容；</span></li><li><span>然后将内容设置为六级标题（例如：</span><code>###### 这条是表格题注</code><span>），同时该六级标题内容在生成题注后，不会被隐藏。</span></li></ul></li><li><p><strong><span>扩展语法、双题注方案：</span></strong></p><ul><li><span>在表格、mermaid 图表、代码块前增加题注描述，使用语法是 VLOOK™ 扩展 GFM 的添加图片的 Markdown 语法；</span></li><li><span>语法：</span><code>`![默认题注]&quot;第2题注&quot;</code><span>，其中的「第 2 题注」内容为可选；</span></li><li><span>该语法的所有内容由 VLOOK™ 转换后被隐藏，若要保留原始标题内容，可另起一行进行描述。</span></li></ul></li></ul></blockquote></blockquote><p><span>有关 </span><strong><span>表格、mermaid 图表</span></strong><span> 的题注效果效果可以继续看下面</span><a href='#表格单元格合并'><span>表格单元格合并</span></a><span>的表格样例</span></p><h3><a name="表格单元格合并" class="md-header-anchor"></a><span>表格单元格合并</span></h3><p><span>表格是文档中最多见的元素，虽然 GFM 扩展了 Markdown 的语法实现了对表格的支持，但对排版上的支持还是比较弱。</span><br><span>目前 Markdown 粉们呼声最多的就是单元格合并了～</span></p><p><strong><span>现在 VLOOK™ 已为你带了简洁、优雅的单元格跨行、跨列合并的解决方案：</span></strong></p><blockquote><p><span>[+] </span><strong><span>跨列合并（横向）语法</span></strong></p><blockquote><p><span>单元格内容为两个连续的英文等号</span><code>==</code><span>进行标识，该单元格将会与左邻的单元格进行合并，以此类推。</span></p></blockquote><p><span>[+] </span><strong><span>跨行合并（纵向）语法</span></strong></p><blockquote><p><span>单元格内容为两个连续的英文句号</span><code>..</code><span>进行标识，该单元格将会与上方的单元格进行合并，同时还支持表头的跨行合并。</span></p></blockquote></blockquote><h6><a name="示例一单元格并列合并行合并注须使用最新版的-typora-和-vlook" class="md-header-anchor"></a><span>![示例一：单元格并列合并、行合并]&quot;注：须使用最新版的 Typora 和 VLOOK&quot;</span></h6><figure><table><thead><tr><th><span>普通列头</span></th><th><code>#标签|测试#</code><span>列合并（2列）</span></th><th><span>==</span></th><th><span>行合并（2行）</span></th><th><span>列合并（3列）</span></th><th><span>==</span></th><th><span>==</span></th></tr></thead><tbody><tr><td><strong><span>行合并（3行）</span></strong></td><td><span>普通单元格</span></td><td><span>普通单元格</span></td><td><span>普通单元格</span></td><td><span>普通单元格</span></td><td><span>普通单元格</span></td><td><strong><span>跨行（全合并）</span></strong></td></tr><tr><td><span>..</span></td><td><strong><span>行合并（2行）</span></strong><code>#标签|测试#</code></td><td><strong><span>列合并（4列）</span></strong></td><td><span>==</span></td><td><span>==</span></td><td><span>==</span></td><td><span>..</span></td></tr><tr><td><span>..</span></td><td><span>..</span></td><td><span>普通单元格</span></td><td><span>普通单元格</span></td><td><span>普通单元格</span></td><td><span>普通单元格</span></td><td><span>..</span></td></tr><tr><td><span>普通单元格</span></td><td><strong><span>行合并（3行）</span></strong></td><td><span>普通单元格</span></td><td><span>普通单元格</span></td><td><span>普通单元格</span></td><td><span>普通单元格</span></td><td><span>..</span></td></tr><tr><td><span>普通单元格</span></td><td><span>..</span></td><td><code>#标签|测试#</code><span>普通单元格</span></td><td><span>普通单元格</span></td><td><span>普通单元格</span></td><td><span>普通单元格</span></td><td><span>..</span></td></tr><tr><td><span>普通单元格</span></td><td><span>..</span></td><td><span>普通单元格</span></td><td><span>普通单元格</span></td><td><span>普通单元格</span></td><td><span>普通单元格</span></td><td><span>..</span></td></tr></tbody></table></figure><h6><a name="示例二表头跨行合并1" class="md-header-anchor"></a><span>![示例二：表头跨行合并1]</span></h6><figure><table><thead><tr><th><span>列头行合并（2行）</span></th><th><span>列头列合并（2列）</span></th><th><span>==</span></th><th style='text-align:center;' ><span>列头行合并（2行）</span></th><th><span>列头列合并（3列）</span></th><th><span>==</span></th><th><span>==</span></th></tr></thead><tbody><tr><td><span>..</span></td><td><span>二级列头</span></td><td><span>二级列头</span></td><td style='text-align:center;' ><span>..</span></td><td><span>二级列头</span></td><td><span>二级列头</span></td><td><span>二级列头</span></td></tr><tr><td><span>普通单元格</span></td><td><span>普通单元格</span></td><td><span>普通单元格</span></td><td style='text-align:center;' ><span>普通单元格</span></td><td><span>普通单元格</span></td><td><span>普通单元格</span></td><td><span>普通单元格</span></td></tr><tr><td><span>普通单元格</span></td><td><span>普通单元格</span></td><td><span>普通单元格</span></td><td style='text-align:center;' ><span>普通单元格</span></td><td><span>普通单元格</span></td><td><span>普通单元格</span></td><td><span>普通单元格</span></td></tr></tbody></table></figure><h6><a name="示例三表头跨行合并2" class="md-header-anchor"></a><span>![示例三：表头跨行合并2]</span></h6><figure><table><thead><tr><th><span>列头行合并（2行）</span></th><th><span>列头行合并（3列）</span></th><th><span>列头列合并（3列）</span></th><th style='text-align:center;' ><span>==</span></th><th><span>==</span></th><th><span>普通列头</span></th><th><span>普通列头</span></th></tr></thead><tbody><tr><td><span>..</span></td><td><span>..</span></td><td><span>二级列头1</span></td><td style='text-align:center;' ><span>二级列头2</span></td><td><span>二级列头3</span></td><td><span>..</span></td><td><span>..</span></td></tr><tr><td><span>..</span></td><td><span>..</span></td><td><span>三级列头1</span></td><td style='text-align:center;' ><span>三级列头2</span></td><td><span>三级列头3</span></td><td><span>..</span></td><td><span>..</span></td></tr><tr><td><span>普通单元格</span></td><td><span>普通单元格</span></td><td><span>普通单元格</span></td><td style='text-align:center;' ><span>普通单元格</span></td><td><span>普通单元格</span></td><td><span>普通单元格</span></td><td><span>普通单元格</span></td></tr></tbody></table></figure><p><code>#注意#</code><span>如果你还需要对表格的列格式进行设置（如整列加粗、斜体等），VLOOK™ 也提供了同样好的支持，详见以下的</span><a href='#表格列格式设置'><span>表格列格式设置</span></a></p><h3><a name="表格列格式设置" class="md-header-anchor"></a><span>表格列格式设置</span></h3><p><span>表格是文档中最多见的元素，虽然 GFM 扩展了 Markdown 的语法实现了对表格的支持，但对排版上的支持还是比较弱。</span></p><p><span>VLOOK™ 除了为你带来单元格合并的能力外，还支持设置表格整列格式的能力～</span></p><h6><a name="表格设置列格式后的混合排版效果" class="md-header-anchor"></a><span>![表格设置列格式后的混合排版效果]</span></h6><figure><table><thead><tr><th style='text-align:center;' ><strong><span>加粗列</span></strong></th><th><code>#标签#</code><em><span>斜体列</span></em></th><th><u><span>下划线</span></u></th><th><mark><span>高亮列</span></mark></th><th><del><span>删除线列</span></del></th></tr></thead><tbody><tr><td style='text-align:center;' ><span>单元格</span></td><td><span>单元格</span></td><td><span>单元格</span></td><td><span>单元格</span><code>#标签#</code><span>单元格</span></td><td><span>单元格</span><code>#标签组|标签#</code><span>单元格</span></td></tr><tr><td style='text-align:center;' ><span>单元格</span></td><td><span>单元格</span></td><td><span>单元格</span></td><td><span>单元格内有</span><strong><span>加粗</span></strong><span>内容</span></td><td><span>单元格内有</span><strong><span>加粗</span></strong><span>内容</span></td></tr><tr><td style='text-align:center;' ><span>单元格</span></td><td><span>单元格</span></td><td><span>单元格</span></td><td><span>单元格内有</span><code>行内代码</code><span>内容</span></td><td><span>单元格内有</span><code>行内代码</code><span>内容</span></td></tr></tbody></table></figure><h6><a name="表格设置列格式后混合排版效果格式嵌套）" class="md-header-anchor"></a><span>![表格设置列格式后混合排版效果（格式嵌套）]</span></h6><figure><table><thead><tr><th style='text-align:center;' ><strong><em><u><span>加粗+斜体+下划线列</span></u></em></strong></th><th><mark><u><span>高亮+下划线</span></u></mark></th><th><strong><mark><span>加粗+高亮列</span></mark></strong></th><th><del><strong><span>删除线+加粗列</span></strong></del></th></tr></thead><tbody><tr><td style='text-align:center;' ><span>单元格</span></td><td><span>单元格</span></td><td><span>单元格</span><code>#标签#</code><span>单元格</span></td><td><span>单元格</span><code>#标签组|标签#</code><span>单元格</span></td></tr><tr><td style='text-align:center;' ><span>单元格</span></td><td><span>单元格</span></td><td><span>单元格内有</span><strong><span>加粗</span></strong><span>内容</span></td><td><span>单元格内有</span><strong><span>加粗</span></strong><span>内容</span></td></tr><tr><td style='text-align:center;' ><span>单元格</span></td><td><span>单元格</span></td><td><span>单元格内有</span><code>行内代码</code><span>内容</span></td><td><span>单元格内有</span><code>行内代码</code><span>内容</span></td></tr></tbody></table></figure><blockquote><p><span>[+] </span><strong><span>应用表格列格式的使用规范</span></strong></p><blockquote><p><span>只须在表头按以标准的 Markdown 或 GFM 的格式设置语法设置对应的格式即可实现整列格式化，支持格式如下：</span></p><p><code>**加粗**</code><span>、</span><code>*斜体*</code><span>、</span><code>&lt;u&gt;下划线&lt;/u&gt;</code><span>、</span><code>==高亮==</code><span>、</span><code>~~删除线~~</code></p></blockquote></blockquote><h3><a name="彩虹标签" class="md-header-anchor"></a><span>彩虹标签</span></h3><p><span>VLOOK™ 基于 Markdown 的行内代码标记</span><code>` `</code><span> ，扩展语法来支持 </span><strong><span>标签(tag)</span></strong><span> 功能，并能同时支持 </span><strong><span>单标签</span></strong><span>、</span><strong><span>双标签（嵌套标签）</span></strong><span>。</span></p><h4><a name="单标签风格" class="md-header-anchor"></a><span>单标签风格</span></h4><ul><li><p><span>语法：在行内代码内，以</span><code>#</code><span>开始，并以</span><code>#</code><span>结束，如：</span><code>`#标签#`</code><span>；</span></p></li><li><p><span>还能可以通过在结束的</span><code>#</code><span>后添加指定不同的类型后缀标识，实现不同类型的标签会以不同的样式进行渲染：</span></p><p><span>![单标签示例]&quot;（不指定后缀标识时，默认为 caution）&quot;</span></p><figure><table><thead><tr><th style='text-align:center;' ><strong><span>后缀标识</span></strong></th><th><span>举例</span></th><th><span>应用场景建议</span></th><th style='text-align:center;' ><strong><span>色调</span></strong></th><th><span>渲染效果</span></th></tr></thead><tbody><tr><td style='text-align:center;' ><span>msg</span></td><td><code>`#标签#msg`</code></td><td><span>信息、资讯、公告</span></td><td style='text-align:center;' ><span>蓝</span></td><td><code>#标签#msg</code></td></tr><tr><td style='text-align:center;' ><span>tips</span></td><td><code>`#标签#tips`</code></td><td><span>提示、备忘、参考、新增</span></td><td style='text-align:center;' ><span>绿</span></td><td><code>#标签#tips</code></td></tr><tr><td style='text-align:center;' ><span>notice</span></td><td><code>`#标签#notice`</code></td><td><span>提醒、注意、关注、优化、修复</span></td><td style='text-align:center;' ><span>橙</span></td><td><code>#标签#notice</code></td></tr><tr><td style='text-align:center;' ><span>caution</span></td><td><code>`#标签#caution`</code></td><td><span>警告、危险、关键事项、删除</span></td><td style='text-align:center;' ><span>红</span></td><td><code>#标签#caution</code></td></tr><tr><td style='text-align:center;' ><span>spare</span></td><td><code>`#标签#spare`</code></td><td><span>延伸、扩展、保留、备用</span></td><td style='text-align:center;' ><span>紫</span></td><td><code>#标签#spare</code></td></tr><tr><td style='text-align:center;' ><span>idle</span></td><td><code>`#标签#idle`</code></td><td><span>无效、暂缓、停用、结束</span></td><td style='text-align:center;' ><span>灰</span></td><td><code>#标签#idle</code></td></tr></tbody></table></figure></li></ul><h4><a name="双标签风格" class="md-header-anchor"></a><span>双标签风格</span></h4><ul><li><p><span>支持嵌套式的双标签，满足二元结构内容的应用需要，举例如下：</span></p><ul><li><code>#版本号|V1.0.2#msg</code></li><li><code>#变更 X 的取值|1234.00#tips</code></li><li><code>#优先级|中#notice</code></li><li><code>#优先级|高#</code></li></ul></li><li><p><span>语法：在「</span><strong><span>单标签</span></strong><span>」语法的基础上，以英文竖线符号</span><code>|</code><span>作为分隔符，如</span><code>`#标签组|标签#`</code><span>：</span></p><p><span>![双标签（嵌套标签）示例]&quot;（不指定后缀标识时，默认为 caution）&quot;</span></p><figure><table><thead><tr><th style='text-align:center;' ><strong><span>后缀标识</span></strong></th><th><span>举例</span></th><th><span>应用场景建议</span></th><th style='text-align:center;' ><strong><span>色调</span></strong></th><th><span>渲染效果</span></th></tr></thead><tbody><tr><td style='text-align:center;' ><span>msg</span></td><td><code>`#标签组|标签#msg`</code></td><td><span>信息、资讯、公告</span></td><td style='text-align:center;' ><span>蓝</span></td><td><code>#标签组|标签#msg</code></td></tr><tr><td style='text-align:center;' ><span>tips</span></td><td><code>`#标签组|标签#tips`</code></td><td><span>提示、备忘、参考、新增</span></td><td style='text-align:center;' ><span>绿</span></td><td><code>#标签组|标签#tips</code></td></tr><tr><td style='text-align:center;' ><span>notice</span></td><td><code>`#标签组|标签#notice`</code></td><td><span>提醒、注意、关注、优化、修复</span></td><td style='text-align:center;' ><span>橙</span></td><td><code>#标签组|标签#notice</code></td></tr><tr><td style='text-align:center;' ><span>caution</span></td><td><code>`#标签组|标签#caution`</code></td><td><span>警告、危险、关键事项、删除</span></td><td style='text-align:center;' ><span>红</span></td><td><code>#标签组|标签#caution</code></td></tr><tr><td style='text-align:center;' ><span>spare</span></td><td><code>`#标签组|标签#spare`</code></td><td><span>延伸、扩展、保留、备用</span></td><td style='text-align:center;' ><span>此</span></td><td><code>#标签组|标签#spare</code></td></tr><tr><td style='text-align:center;' ><span>idle</span></td><td><code>`#标签组|标签#idle`</code></td><td><span>无效、暂缓、停用、结束</span></td><td style='text-align:center;' ><span>灰</span></td><td><code>#标签组|标签#idle</code></td></tr></tbody></table></figure></li></ul><h3><a name="mermaid-样式优化" class="md-header-anchor"></a><span>mermaid 样式优化</span></h3><p><span>VLOOK™ 针对比较受关注的 mermaid 图表提供了样式的统一和优化，并提供跨平台跨浏览器的兼容性补丁。</span></p><blockquote><p><span>[+] </span><strong><span>统一和优化样式</span></strong></p><blockquote><p><span>支持 mermaid 的 </span><strong><span>饼图、流程图、状态图、顺序图、类图、甘特图</span></strong><span>，同时还能自动适配 </span><a href='#dark-模式'><span>Dark 模式</span></a><span>。</span></p><p><span>除了样式优化外，还对书写规范进行了统一，效果比其官网的要好上许多许多～</span></p><ul><li><span>基于流程图衍生出状态机图；</span></li><li><span>针对顺序图，支持不同角色类型（人、系统、重要系统、外部系统），重绘不同的外观样式；</span></li><li><span>针对顺序图的 </span><code>#opt#spare</code><span> </span><code>#alt / else#</code><span> </span><code>#loop#notice</code><span> 标签优化不同的外观样式，以及自动翻译为当前浏览器的语言。</span></li></ul></blockquote><p><span>[+] </span><strong><span>跨平台跨浏览器的兼容性补丁</span></strong></p><blockquote><p><span>操作系统涉及 Windows、macOS、Linux，分辨率涉及到普通和高清，浏览器涉及主流的 Chrome / Firefox / Edge。</span></p><p><span>mermaid 的图表在以上复杂情况下的一致性还是做得不够到位，所以 VLOOK™ 提供了一个非官方的兼容补丁，为大家提供一个更好的浏览体验</span></p></blockquote></blockquote><h6><a name="mermaid-的流程图" class="md-header-anchor"></a><span>mermaid 的流程图</span></h6><p><span>![流程图]&quot;（以上的「分支流程」内容由下图进行接续）&quot;</span></p><div class="md-diagram-panel"><svg id="mermaidChart16" width="100%" xmlns="http://www.w3.org/2000/svg" style="max-width: 780.5968780517578px;" viewBox="0 0 780.5968780517578 291.4000015258789"><style>
:root { --mermaid-font-family: sans-serif}
:root { --mermaid-alt-font-family: sans-serif}</style><style></style><g transform="translate(-12, -12)"><g class="output"><g class="clusters"><g class="cluster" id="子图" transform="translate(268.8984375,199.4000015258789)" style="opacity: 1;"><rect width="301.796875" height="192" x="-150.8984375" y="-96"></rect><g class="label" transform="translate(0, -82)" id="mermaidChart16Text"><g transform="translate(-14,-8)"><foreignObject width="28" height="16"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 0.9rem; line-height: 16px; white-space: nowrap;">子图</div></foreignObject></g></g></g></g><g class="edgePaths"><g class="edgePath" style="opacity: 1;"><path class="path" d="M68,199.4000015258789L93,199.4000015258789L118,199.4000015258789L143,199.4000015258789" marker-end="url(#arrowhead504)" style="fill:none"></path><defs><marker id="arrowhead504" viewBox="0 0 10 10" refX="9" refY="5" markerUnits="strokeWidth" markerWidth="8" markerHeight="6" orient="auto"><path d="M 0 0 L 10 5 L 0 10 z" class="arrowheadPath" style="stroke-width: 1px; stroke-dasharray: 1px, 0px;"></path></marker></defs></g><g class="edgePath" style="opacity: 1;"><path class="path" d="M214.86446220930233,181.4000015258789L261.8984375,156.4000015258789L304.796875,156.4000015258789" marker-end="url(#arrowhead505)" style="fill:none"></path><defs><marker id="arrowhead505" viewBox="0 0 10 10" refX="9" refY="5" markerUnits="strokeWidth" markerWidth="8" markerHeight="6" orient="auto"><path d="M 0 0 L 10 5 L 0 10 z" class="arrowheadPath" style="stroke-width: 1px; stroke-dasharray: 1px, 0px;"></path></marker></defs></g><g class="edgePath" style="opacity: 1;"><path class="path" d="M214.86446220930233,217.4000015258789L261.8984375,242.4000015258789L331.796875,242.4000015258789" marker-end="url(#arrowhead506)" style="fill:none"></path><defs><marker id="arrowhead506" viewBox="0 0 10 10" refX="9" refY="5" markerUnits="strokeWidth" markerWidth="8" markerHeight="6" orient="auto"><path d="M 0 0 L 10 5 L 0 10 z" class="arrowheadPath" style="stroke-width: 1px; stroke-dasharray: 1px, 0px;"></path></marker></defs></g><g class="edgePath" style="opacity: 1;"><path class="path" d="M394.796875,156.4000015258789L419.796875,156.4000015258789L472.796875,156.4000015258789L526.2968765258789,156.9000015258789" marker-end="url(#arrowhead507)" style="troke-width: 3.5px;fill:none"></path><defs><marker id="arrowhead507" viewBox="0 0 10 10" refX="9" refY="5" markerUnits="strokeWidth" markerWidth="8" markerHeight="6" orient="auto"><path d="M 0 0 L 10 5 L 0 10 z" class="arrowheadPath" style="stroke-width: 1px; stroke-dasharray: 1px, 0px;"></path></marker></defs></g><g class="edgePath" style="opacity: 1;"><path class="path" d="M609.1165486781159,138.9196736781158L658.5968780517578,110.70000076293945L713.5968780517578,69.48481035836136" marker-end="url(#arrowhead508)" style="fill:none"></path><defs><marker id="arrowhead508" viewBox="0 0 10 10" refX="9" refY="5" markerUnits="strokeWidth" markerWidth="8" markerHeight="6" orient="auto"><path d="M 0 0 L 10 5 L 0 10 z" class="arrowheadPath" style="stroke-width: 1px; stroke-dasharray: 1px, 0px;"></path></marker></defs></g><g class="edgePath" style="opacity: 1;"><path class="path" d="M618.4771558185128,165.51971918148726L658.5968780517578,173.4000015258789L709.0968780517578,173.9000015258789" marker-end="url(#arrowhead509)" style="fill:none;stroke-width:2px;stroke-dasharray:3;"></path><defs><marker id="arrowhead509" viewBox="0 0 10 10" refX="9" refY="5" markerUnits="strokeWidth" markerWidth="8" markerHeight="6" orient="auto"><path d="M 0 0 L 10 5 L 0 10 z" class="arrowheadPath" style="stroke-width: 1px; stroke-dasharray: 1px, 0px;"></path></marker></defs></g><g class="edgePath" style="opacity: 1;"><path class="path" d="M594.1968765258789,38L658.5968780517578,38L713.5968780517578,47.39873417721519" marker-end="url(#arrowhead510)" style="fill:none"></path><defs><marker id="arrowhead510" viewBox="0 0 10 10" refX="9" refY="5" markerUnits="strokeWidth" markerWidth="8" markerHeight="6" orient="auto"><path d="M 0 0 L 10 5 L 0 10 z" class="arrowheadPath" style="stroke-width: 1px; stroke-dasharray: 1px, 0px;"></path></marker></defs></g></g><g class="edgeLabels"><g class="edgeLabel" transform="" style="opacity: 1;"><g transform="translate(0,0)" class="label"><foreignObject width="0" height="0"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; white-space: nowrap;"><span></span></div></foreignObject></g></g><g class="edgeLabel" transform="translate(261.8984375,156.4000015258789)" style="opacity: 1;"><g transform="translate(-17.8984375,-7)" class="label"><foreignObject width="35.796875" height="14"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; white-space: nowrap;"><span>情况1</span></div></foreignObject></g></g><g class="edgeLabel" transform="translate(261.8984375,242.4000015258789)" style="opacity: 1;"><g transform="translate(-17.8984375,-7)" class="label"><foreignObject width="35.796875" height="14"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; white-space: nowrap;"><span>情况2</span></div></foreignObject></g></g><g class="edgeLabel" transform="translate(472.796875,156.4000015258789)" style="opacity: 1;"><g transform="translate(-28,-7)" class="label"><foreignObject width="56" height="14"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; white-space: nowrap;"><span>重要分支</span></div></foreignObject></g></g><g class="edgeLabel" transform="translate(658.5968780517578,110.70000076293945)" style="opacity: 1;"><g transform="translate(-7,-7)" class="label"><foreignObject width="14" height="14"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; white-space: nowrap;"><span>是</span></div></foreignObject></g></g><g class="edgeLabel" transform="translate(658.5968780517578,173.4000015258789)" style="opacity: 1;"><g transform="translate(-7,-7)" class="label"><foreignObject width="14" height="14"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; white-space: nowrap;"><span>否</span></div></foreignObject></g></g><g class="edgeLabel" transform="" style="opacity: 1;"><g transform="translate(0,0)" class="label"><foreignObject width="0" height="0"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; white-space: nowrap;"><span></span></div></foreignObject></g></g></g><g class="nodes"><g class="node" id="groud1" transform="translate(349.796875,156.4000015258789)" style="opacity: 1;"><rect rx="0" ry="0" x="-45" y="-18" width="90" height="36"></rect><g class="label" transform="translate(0,0)"><g transform="translate(-35,-8)"><foreignObject width="70" height="16"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 0.9rem; line-height: 16px; white-space: nowrap;">流程组节点</div></foreignObject></g></g></g><g class="node" id="node1" transform="translate(181,199.4000015258789)" style="opacity: 1;"><rect rx="5" ry="5" x="-38" y="-18" width="76" height="36"></rect><g class="label" transform="translate(0,0)"><g transform="translate(-28,-8)"><foreignObject width="56" height="16"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 0.9rem; line-height: 16px; white-space: nowrap;">普通节点</div></foreignObject></g></g></g><g class="node" id="A1" transform="translate(349.796875,242.4000015258789)" style="opacity: 1;"><circle x="-14.671875" y="-18" r="18"></circle><g class="label" transform="translate(0,0)"><g transform="translate(-4.671875,-8)"><foreignObject width="9.34375" height="16"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 0.9rem; line-height: 16px; white-space: nowrap;">A</div></foreignObject></g></g></g><g class="node" id="START" transform="translate(44,199.4000015258789)" style="opacity: 1;"><rect rx="5" ry="5" x="-24" y="-18" width="48" height="36"></rect><g class="label" transform="translate(0,0)"><g transform="translate(-14,-8)"><foreignObject width="28" height="16"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 0.9rem; line-height: 16px; white-space: nowrap;">开始</div></foreignObject></g></g></g><g class="node" id="cond1" transform="translate(576.1968765258789,156.4000015258789)" style="opacity: 1;"><polygon points="50.4,0 100.8,-50.4 50.4,-100.8 0,-50.4" transform="translate(-50.4,50.4)"></polygon><g class="label" transform="translate(0,0)"><g transform="translate(-28,-8)"><foreignObject width="56" height="16"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 0.9rem; line-height: 16px; white-space: nowrap;">条件判断</div></foreignObject></g></g></g><g class="node" id="END" transform="translate(737.5968780517578,51.5)" style="opacity: 1;"><rect rx="5" ry="5" x="-24" y="-18" width="48" height="36"></rect><g class="label" transform="translate(0,0)"><g transform="translate(-14,-8)"><foreignObject width="28" height="16"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 0.9rem; line-height: 16px; white-space: nowrap;">结束</div></foreignObject></g></g></g><g class="node" id="page2" transform="translate(737.5968780517578,173.4000015258789)" style="opacity: 1;"><polygon points="-18,0 76,0 76,-36 -18,-36 0,-18" transform="translate(-38,18)"></polygon><g class="label" transform="translate(0,0)"><g transform="translate(-28,-8)"><foreignObject width="56" height="16"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 0.9rem; line-height: 16px; white-space: nowrap;">分支流程</div></foreignObject></g></g></g><g class="node" id="A2" transform="translate(576.1968765258789,38)" style="opacity: 1;"><circle x="-14.671875" y="-18" r="18"></circle><g class="label" transform="translate(0,0)"><g transform="translate(-4.671875,-8)"><foreignObject width="9.34375" height="16"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 0.9rem; line-height: 16px; white-space: nowrap;">A</div></foreignObject></g></g></g></g></g></g></svg></div><p><span>![分支流程（接续上图）]</span></p><div class="md-diagram-panel"><svg id="mermaidChart17" width="100%" xmlns="http://www.w3.org/2000/svg" style="max-width: 334px;" viewBox="0 0 334 52"><style>
:root { --mermaid-font-family: sans-serif}
:root { --mermaid-alt-font-family: sans-serif}</style><style></style><g transform="translate(-12, -12)"><g class="output"><g class="clusters"></g><g class="edgePaths"><g class="edgePath" style="opacity: 1;"><path class="path" d="M114.5,38.5L139,38L164,38" marker-end="url(#arrowhead522)" style="fill:none"></path><defs><marker id="arrowhead522" viewBox="0 0 10 10" refX="9" refY="5" markerUnits="strokeWidth" markerWidth="8" markerHeight="6" orient="auto"><path d="M 0 0 L 10 5 L 0 10 z" class="arrowheadPath" style="stroke-width: 1px; stroke-dasharray: 1px, 0px;"></path></marker></defs></g><g class="edgePath" style="opacity: 1;"><path class="path" d="M240,38L265,38L290,38" marker-end="url(#arrowhead523)" style="fill:none"></path><defs><marker id="arrowhead523" viewBox="0 0 10 10" refX="9" refY="5" markerUnits="strokeWidth" markerWidth="8" markerHeight="6" orient="auto"><path d="M 0 0 L 10 5 L 0 10 z" class="arrowheadPath" style="stroke-width: 1px; stroke-dasharray: 1px, 0px;"></path></marker></defs></g></g><g class="edgeLabels"><g class="edgeLabel" transform="" style="opacity: 1;"><g transform="translate(0,0)" class="label"><foreignObject width="0" height="0"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; white-space: nowrap;"><span></span></div></foreignObject></g></g><g class="edgeLabel" transform="" style="opacity: 1;"><g transform="translate(0,0)" class="label"><foreignObject width="0" height="0"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; white-space: nowrap;"><span></span></div></foreignObject></g></g></g><g class="nodes"><g class="node" id="page2" transform="translate(67,38)" style="opacity: 1;"><polygon points="-18,0 76,0 76,-36 -18,-36 0,-18" transform="translate(-38,18)"></polygon><g class="label" transform="translate(0,0)"><g transform="translate(-28,-8)"><foreignObject width="56" height="16"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 0.9rem; line-height: 16px; white-space: nowrap;">分支流程</div></foreignObject></g></g></g><g class="node" id="node2" transform="translate(202,38)" style="opacity: 1;"><rect rx="5" ry="5" x="-38" y="-18" width="76" height="36"></rect><g class="label" transform="translate(0,0)"><g transform="translate(-28,-8)"><foreignObject width="56" height="16"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 0.9rem; line-height: 16px; white-space: nowrap;">普通节点</div></foreignObject></g></g></g><g class="node" id="END" transform="translate(314,38)" style="opacity: 1;"><rect rx="5" ry="5" x="-24" y="-18" width="48" height="36"></rect><g class="label" transform="translate(0,0)"><g transform="translate(-14,-8)"><foreignObject width="28" height="16"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 0.9rem; line-height: 16px; white-space: nowrap;">结束</div></foreignObject></g></g></g></g></g></g></svg></div><h6><a name="mermaid-的状态图" class="md-header-anchor"></a><span>mermaid 的状态图</span></h6><p><span>![由 mermaid 流程图语法衍生的状态图]</span></p><div class="md-diagram-panel"><svg id="mermaidChart18" width="100%" xmlns="http://www.w3.org/2000/svg" style="max-width: 867.359375px;" viewBox="0 0 867.359375 172"><style>
:root { --mermaid-font-family: sans-serif}
:root { --mermaid-alt-font-family: sans-serif}</style><style></style><g transform="translate(-12, -12)"><g class="output"><g class="clusters"></g><g class="edgePaths"><g class="edgePath" style="opacity: 1;"><path class="path" d="M40,98L79,98L118,98" marker-end="url(#arrowhead563)" style="fill:none"></path><defs><marker id="arrowhead563" viewBox="0 0 10 10" refX="9" refY="5" markerUnits="strokeWidth" markerWidth="8" markerHeight="6" orient="auto"><path d="M 0 0 L 10 5 L 0 10 z" class="arrowheadPath" style="stroke-width: 1px; stroke-dasharray: 1px, 0px;"></path></marker></defs></g><g class="edgePath" style="opacity: 1;"><path class="path" d="M175.34375,98L228.34375,98L281.84375,98.5" marker-end="url(#arrowhead564)" style="fill:none"></path><defs><marker id="arrowhead564" viewBox="0 0 10 10" refX="9" refY="5" markerUnits="strokeWidth" markerWidth="8" markerHeight="6" orient="auto"><path d="M 0 0 L 10 5 L 0 10 z" class="arrowheadPath" style="stroke-width: 1px; stroke-dasharray: 1px, 0px;"></path></marker></defs></g><g class="edgePath" style="opacity: 1;"><path class="path" d="M310.39547413793105,91.05172413793103L384.34375,38L501.6171875,38" marker-end="url(#arrowhead565)" style="fill:none"></path><defs><marker id="arrowhead565" viewBox="0 0 10 10" refX="9" refY="5" markerUnits="strokeWidth" markerWidth="8" markerHeight="6" orient="auto"><path d="M 0 0 L 10 5 L 0 10 z" class="arrowheadPath" style="stroke-width: 1px; stroke-dasharray: 1px, 0px;"></path></marker></defs></g><g class="edgePath" style="opacity: 1;"><path class="path" d="M558.9609375,38L676.234375,38L743.234375,58.92387768379961" marker-end="url(#arrowhead566)" style="fill:none"></path><defs><marker id="arrowhead566" viewBox="0 0 10 10" refX="9" refY="5" markerUnits="strokeWidth" markerWidth="8" markerHeight="6" orient="auto"><path d="M 0 0 L 10 5 L 0 10 z" class="arrowheadPath" style="stroke-width: 1px; stroke-dasharray: 1px, 0px;"></path></marker></defs></g><g class="edgePath" style="opacity: 1;"><path class="path" d="M317.84375,98.5L384.34375,98L530.2890625,98L676.234375,98L743.234375,77.07612231620038" marker-end="url(#arrowhead567)" style="fill:none;stroke-width:2px;stroke-dasharray:3;"></path><defs><marker id="arrowhead567" viewBox="0 0 10 10" refX="9" refY="5" markerUnits="strokeWidth" markerWidth="8" markerHeight="6" orient="auto"><path d="M 0 0 L 10 5 L 0 10 z" class="arrowheadPath" style="stroke-width: 1px; stroke-dasharray: 1px, 0px;"></path></marker></defs></g><g class="edgePath" style="opacity: 1;"><path class="path" d="M801.359375,68L826.359375,68L855.0466610163043,103.24437996288808" marker-end="url(#arrowhead568)" style="fill:none"></path><defs><marker id="arrowhead568" viewBox="0 0 10 10" refX="9" refY="5" markerUnits="strokeWidth" markerWidth="8" markerHeight="6" orient="auto"><path d="M 0 0 L 10 5 L 0 10 z" class="arrowheadPath" style="stroke-width: 1px; stroke-dasharray: 1px, 0px;"></path></marker></defs></g><g class="edgePath" style="opacity: 1;"><path class="path" d="M310.39547413793105,105.94827586206897L384.34375,158L530.2890625,158L676.234375,158L743.234375,158" marker-end="url(#arrowhead569)" style="fill:none;stroke-width:2px;stroke-dasharray:3;"></path><defs><marker id="arrowhead569" viewBox="0 0 10 10" refX="9" refY="5" markerUnits="strokeWidth" markerWidth="8" markerHeight="6" orient="auto"><path d="M 0 0 L 10 5 L 0 10 z" class="arrowheadPath" style="stroke-width: 1px; stroke-dasharray: 1px, 0px;"></path></marker></defs></g><g class="edgePath" style="opacity: 1;"><path class="path" d="M801.359375,158L826.359375,158L855.3867135400184,119.02043110340395" marker-end="url(#arrowhead570)" style="fill:none"></path><defs><marker id="arrowhead570" viewBox="0 0 10 10" refX="9" refY="5" markerUnits="strokeWidth" markerWidth="8" markerHeight="6" orient="auto"><path d="M 0 0 L 10 5 L 0 10 z" class="arrowheadPath" style="stroke-width: 1px; stroke-dasharray: 1px, 0px;"></path></marker></defs></g></g><g class="edgeLabels"><g class="edgeLabel" transform="translate(79,98)" style="opacity: 1;"><g transform="translate(-14,-7)" class="label"><foreignObject width="28" height="14"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; white-space: nowrap;"><span>初始</span></div></foreignObject></g></g><g class="edgeLabel" transform="translate(228.34375,98)" style="opacity: 1;"><g transform="translate(-28,-7)" class="label"><foreignObject width="56" height="14"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; white-space: nowrap;"><span>复杂变更</span></div></foreignObject></g></g><g class="edgeLabel" transform="translate(384.34375,38)" style="opacity: 1;"><g transform="translate(-42,-7)" class="label"><foreignObject width="84" height="14"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; white-space: nowrap;"><span>变更条件说明</span></div></foreignObject></g></g><g class="edgeLabel" transform="translate(676.234375,38)" style="opacity: 1;"><g transform="translate(-42,-7)" class="label"><foreignObject width="84" height="14"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; white-space: nowrap;"><span>变更条件说明</span></div></foreignObject></g></g><g class="edgeLabel" transform="translate(530.2890625,98)" style="opacity: 1;"><g transform="translate(-78.9453125,-7)" class="label"><foreignObject width="157.890625" height="14"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; white-space: nowrap;"><span>非正常/次要变更条件说明</span></div></foreignObject></g></g><g class="edgeLabel" transform="" style="opacity: 1;"><g transform="translate(0,0)" class="label"><foreignObject width="0" height="0"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; white-space: nowrap;"><span></span></div></foreignObject></g></g><g class="edgeLabel" transform="translate(530.2890625,158)" style="opacity: 1;"><g transform="translate(-78.9453125,-7)" class="label"><foreignObject width="157.890625" height="14"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; white-space: nowrap;"><span>非正常/次要变更条件说明</span></div></foreignObject></g></g><g class="edgeLabel" transform="" style="opacity: 1;"><g transform="translate(0,0)" class="label"><foreignObject width="0" height="0"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; white-space: nowrap;"><span></span></div></foreignObject></g></g></g><g class="nodes"><g class="node" id="INIT" transform="translate(30,98)" style="opacity: 1;"><circle x="-10" y="-10" r="10"></circle><g class="label" transform="translate(0,0)"><g transform="translate(0,0)"><foreignObject width="0" height="0"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 0.9rem; line-height: 0px; white-space: nowrap;"></div></foreignObject></g></g></g><g class="node" id="A" transform="translate(146.671875,98)" style="opacity: 1;"><rect rx="0" ry="0" x="-28.671875" y="-18" width="57.34375" height="36"></rect><g class="label" transform="translate(0,0)"><g transform="translate(-18.671875,-8)"><foreignObject width="37.34375" height="16"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 0.9rem; line-height: 16px; white-space: nowrap;">状态A</div></foreignObject></g></g></g><g class="node" id="trans" transform="translate(299.34375,98)" style="opacity: 1;"><polygon points="18,0 36,-18 18,-36 0,-18" transform="translate(-18,18)"></polygon><g class="label" transform="translate(0,0)"><g transform="translate(0,0)"><foreignObject width="0" height="0"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 0.9rem; line-height: 0px; white-space: nowrap;"></div></foreignObject></g></g></g><g class="node" id="B" transform="translate(530.2890625,38)" style="opacity: 1;"><rect rx="0" ry="0" x="-28.671875" y="-18" width="57.34375" height="36"></rect><g class="label" transform="translate(0,0)"><g transform="translate(-18.671875,-8)"><foreignObject width="37.34375" height="16"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 0.9rem; line-height: 16px; white-space: nowrap;">状态B</div></foreignObject></g></g></g><g class="node" id="C" transform="translate(772.296875,68)" style="opacity: 1;"><rect rx="0" ry="0" x="-29.0625" y="-18" width="58.125" height="36"></rect><g class="label" transform="translate(0,0)"><g transform="translate(-19.0625,-8)"><foreignObject width="38.125" height="16"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 0.9rem; line-height: 16px; white-space: nowrap;">状态C</div></foreignObject></g></g></g><g class="node" id="FINAL" transform="translate(861.359375,111)" style="opacity: 1;"><circle x="-10" y="-10" r="10"></circle><g class="label" transform="translate(0,0)"><g transform="translate(0,0)"><foreignObject width="0" height="0"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 0.9rem; line-height: 0px; white-space: nowrap;"></div></foreignObject></g></g></g><g class="node" id="D" transform="translate(772.296875,158)" style="opacity: 1;"><rect rx="0" ry="0" x="-29.0625" y="-18" width="58.125" height="36"></rect><g class="label" transform="translate(0,0)"><g transform="translate(-19.0625,-8)"><foreignObject width="38.125" height="16"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 0.9rem; line-height: 16px; white-space: nowrap;">状态D</div></foreignObject></g></g></g></g></g></g></svg></div><h6><a name="mermaid-的顺序图" class="md-header-anchor"></a><span>mermaid 的顺序图</span></h6><p><span>![多种不同角色的顺序图，更清晰、更友好]</span></p><div class="md-diagram-panel"><svg id="mermaidChart19" width="866" xmlns="http://www.w3.org/2000/svg" height="738.25" viewBox="-8 -8 866 738.25" style="height: 778.25px;"><style>
:root { --mermaid-font-family: sans-serif}
:root { --mermaid-alt-font-family: sans-serif}</style><style></style><g></g><g><line id="actor16" x1="75" y1="5" x2="75" y2="729.25" class="actor-line" stroke-width="0.5px" stroke="#999"></line><rect x="0" y="0" fill="#eaeaea" stroke="#666" width="150" height="65" rx="3" ry="3" class="actor"></rect><text x="75" y="32.5" dominant-baseline="central" alignment-baseline="central" class="actor" style="text-anchor: middle; font-size: 14px;"><tspan x="75" dy="0">@人物角色</tspan></text></g><g><line id="actor17" x1="275" y1="5" x2="275" y2="729.25" class="actor-line" stroke-width="0.5px" stroke="#999"></line><rect x="200" y="0" fill="#eaeaea" stroke="#666" width="150" height="65" rx="3" ry="3" class="actor"></rect><text x="275" y="32.5" dominant-baseline="central" alignment-baseline="central" class="actor" style="text-anchor: middle; font-size: 14px;"><tspan x="275" dy="0">系统角色</tspan></text></g><g><line id="actor18" x1="475" y1="5" x2="475" y2="729.25" class="actor-line" stroke-width="0.5px" stroke="#999"></line><rect x="400" y="0" fill="#eaeaea" stroke="#666" width="150" height="65" rx="3" ry="3" class="actor"></rect><text x="475" y="32.5" dominant-baseline="central" alignment-baseline="central" class="actor" style="text-anchor: middle; font-size: 14px;"><tspan x="475" dy="0">**重要系统角色**</tspan></text></g><g><line id="actor19" x1="675" y1="5" x2="675" y2="729.25" class="actor-line" stroke-width="0.5px" stroke="#999"></line><rect x="600" y="0" fill="#eaeaea" stroke="#666" width="150" height="65" rx="3" ry="3" class="actor"></rect><text x="675" y="32.5" dominant-baseline="central" alignment-baseline="central" class="actor" style="text-anchor: middle; font-size: 14px;"><tspan x="675" dy="0">--外部系统角色--</tspan></text></g><defs><marker id="arrowhead" refX="5" refY="2" markerWidth="6" markerHeight="4" orient="auto"><path d="M 0,0 V 4 L6,2 Z"></path></marker></defs><defs><marker id="crosshead" markerWidth="15" markerHeight="8" orient="auto" refX="16" refY="4"><path fill="black" stroke="#000000" stroke-width="1px" d="M 9,2 V 6 L16,4 Z" style="stroke-dasharray: 0px, 0px;"></path><path fill="none" stroke="#000000" stroke-width="1px" d="M 0,1 L 6,7 M 6,1 L 0,7" style="stroke-dasharray: 0px, 0px;"></path></marker></defs><defs><marker id="sequencenumber" refX="15" refY="15" markerWidth="60" markerHeight="40" orient="auto"><circle cx="15" cy="15" r="6"></circle></marker></defs><g><text x="175" y="93" class="messageText" style="text-anchor: middle;">同步发送消息1</text><line x1="75" y1="100" x2="275" y2="100" class="messageLine0" stroke-width="2" stroke="black" marker-end="url(#arrowhead)" style="fill: none;"></line></g><g><text x="375" y="128" class="messageText" style="text-anchor: middle;">同步发送消息1</text><line x1="275" y1="135" x2="475" y2="135" class="messageLine0" stroke-width="2" stroke="black" marker-end="url(#arrowhead)" style="fill: none;"></line></g><g><rect x="470" y="137" fill="#EDF2AE" stroke="#666" width="10" height="33" rx="0" ry="0" class="activation0"></rect></g><g><text x="372.5" y="163" class="messageText" style="text-anchor: middle;">异步发送消息2</text><line x1="470" y1="170" x2="275" y2="170" class="messageLine1" stroke-width="2" stroke="black" marker-end="url(#crosshead)" style="stroke-dasharray: 3px, 3px; fill: none;"></line></g><g><text x="675" y="198" class="messageText" style="text-anchor: middle;">内部动作</text><path d="M 675,205 C 735,195 735,235 675,225" class="messageLine0" stroke-width="2" stroke="black" marker-end="url(#arrowhead)" style="fill: none;"></path></g><g><rect x="500" y="243" fill="#EDF2AE" stroke="#666" width="150" height="54.5" rx="0" ry="0" class="note"></rect><text x="496" y="267" class="noteText"><tspan x="516">显示在外部系统</tspan></text><text x="496" y="284.25" class="noteText"><tspan x="516">左侧备注说明</tspan></text></g><g><rect x="700" y="305.5" fill="#EDF2AE" stroke="#666" width="150" height="54.5" rx="0" ry="0" class="note"></rect><text x="696" y="329.5" class="noteText"><tspan x="716">显示在外部系统</tspan></text><text x="696" y="346.75" class="noteText"><tspan x="716">右侧备注说明</tspan></text></g><g><rect x="250" y="368" fill="#EDF2AE" stroke="#666" width="250" height="37.25" rx="0" ry="0" class="note"></rect><text x="246" y="392" class="noteText"><tspan x="266">跨对象备注说明</tspan></text></g><g><text x="475" y="454.25" class="messageText" style="text-anchor: middle;">发送消息A</text><line x1="275" y1="461.25" x2="675" y2="461.25" class="messageLine0" stroke-width="2" stroke="black" marker-end="url(#arrowhead)" style="fill: none;"></line></g><g><rect x="670" y="463.25" fill="#EDF2AE" stroke="#666" width="10" height="177" rx="0" ry="0" class="activation0"></rect></g><g><text x="375" y="510.25" class="messageText" style="text-anchor: middle;">同步返回消息A1</text><line x1="475" y1="517.25" x2="275" y2="517.25" class="messageLine0" stroke-width="2" stroke="black" marker-end="url(#arrowhead)" style="fill: none;"></line></g><g><text x="375" y="561.25" class="messageText" style="text-anchor: middle;">异步返回消息A2</text><line x1="475" y1="568.25" x2="275" y2="568.25" class="messageLine0" stroke-width="2" stroke="black" marker-end="url(#crosshead)" style="fill: none;"></line></g><g><line x1="267" y1="469.25" x2="483" y2="469.25" class="loopLine"></line><line x1="483" y1="469.25" x2="483" y2="576.25" class="loopLine"></line><line x1="267" y1="576.25" x2="483" y2="576.25" class="loopLine"></line><line x1="267" y1="469.25" x2="267" y2="576.25" class="loopLine"></line><line x1="267" y1="525.25" x2="483" y2="525.25" class="loopLine" style="stroke-dasharray: 3px, 3px;"></line><polygon points="267,469.25 317,469.25 317,482.25 308.6,489.25 267,489.25" class="labelBox"></polygon><text x="274.5" y="484.25" class="labelText"><tspan x="274.5">alt</tspan></text><text x="375" y="481.25" class="loopText" style="text-anchor: middle;"><tspan x="375">[ 条件分组分支1 ]</tspan></text><text x="375" y="537.25" class="loopText" style="text-anchor: middle;"><tspan x="375">[ 条件分组分支2 ]</tspan></text></g><g><text x="572.5" y="625.25" class="messageText" style="text-anchor: middle;">发送消息X</text><line x1="670" y1="632.25" x2="475" y2="632.25" class="messageLine0" stroke-width="2" stroke="black" marker-end="url(#arrowhead)" style="fill: none;"></line></g><g><line x1="467" y1="584.25" x2="688" y2="584.25" class="loopLine"></line><line x1="688" y1="584.25" x2="688" y2="640.25" class="loopLine"></line><line x1="467" y1="640.25" x2="688" y2="640.25" class="loopLine"></line><line x1="467" y1="584.25" x2="467" y2="640.25" class="loopLine"></line><polygon points="467,584.25 517,584.25 517,597.25 508.6,604.25 467,604.25" class="labelBox"></polygon><text x="474.5" y="599.25" class="labelText"><tspan x="474.5">opt</tspan></text><text x="577.5" y="596.25" class="loopText" style="text-anchor: middle;"><tspan x="577.5">[ 可选分组 ]</tspan></text></g><g><line x1="259" y1="413.25" x2="696" y2="413.25" class="loopLine"></line><line x1="696" y1="413.25" x2="696" y2="648.25" class="loopLine"></line><line x1="259" y1="648.25" x2="696" y2="648.25" class="loopLine"></line><line x1="259" y1="413.25" x2="259" y2="648.25" class="loopLine"></line><polygon points="259,413.25 309,413.25 309,426.25 300.6,433.25 259,433.25" class="labelBox"></polygon><text x="266.5" y="428.25" class="labelText"><tspan x="266.5">loop</tspan></text><text x="477.5" y="425.25" class="loopText" style="text-anchor: middle;"><tspan x="477.5">[ 循环分组 ]</tspan></text></g><g><rect x="0" y="664.25" fill="#eaeaea" stroke="#666" width="150" height="65" rx="3" ry="3" class="actor"></rect><text x="75" y="696.75" dominant-baseline="central" alignment-baseline="central" class="actor" style="text-anchor: middle; font-size: 14px;"><tspan x="75" dy="0">@人物角色</tspan></text></g><g><rect x="200" y="664.25" fill="#eaeaea" stroke="#666" width="150" height="65" rx="3" ry="3" class="actor"></rect><text x="275" y="696.75" dominant-baseline="central" alignment-baseline="central" class="actor" style="text-anchor: middle; font-size: 14px;"><tspan x="275" dy="0">系统角色</tspan></text></g><g><rect x="400" y="664.25" fill="#eaeaea" stroke="#666" width="150" height="65" rx="3" ry="3" class="actor"></rect><text x="475" y="696.75" dominant-baseline="central" alignment-baseline="central" class="actor" style="text-anchor: middle; font-size: 14px;"><tspan x="475" dy="0">**重要系统角色**</tspan></text></g><g><rect x="600" y="664.25" fill="#eaeaea" stroke="#666" width="150" height="65" rx="3" ry="3" class="actor"></rect><text x="675" y="696.75" dominant-baseline="central" alignment-baseline="central" class="actor" style="text-anchor: middle; font-size: 14px;"><tspan x="675" dy="0">--外部系统角色--</tspan></text></g></svg></div><p><code>#参考#tips</code><span>更多脚本化图表样式，以及结合 VLOOK™ 相关的脚本编写规范内容详见《</span><a href='https://madmaxchow.github.io/VLOOK/chart.html'><span>脚本化图表 for Markdown</span></a><span>》。</span></p><h3><a name="图片反色增加边缘空白" class="md-header-anchor"></a><span>图片反色、增加边缘空白</span></h3><p><span>应用了 VLOOK™ 主题的文档，针对图片提供了更加精细的排版特性。</span></p><h6><a name="指定图片在-dark-模式时反色显示" class="md-header-anchor"></a><span>指定图片在 Dark 模式时反色显示</span></h6><ul><li><span>图片默认在 Dark 模式时按原始颜色显示，对于一些透明底的 PNG 图片（如界面线框图），可指定在 Dark 模式时以反色显示以获得更好的显示效果；</span></li><li><span>对需要在 Dark 模式中以反色显示的图片，可在图片 URL 增加启用 Dark 模式反色标记</span><code>invert=in-dark</code><span>，举例如下：</span></li></ul><p><img src="https://s1.ax1x.com/2020/05/30/tMNjmR.png?padding=true" referrerpolicy="no-referrer" alt="图片默认样式（不指定在 Dark 模式时反色）" title="透明的 PNG 图片会透出背景方格"></p><p><img src="https://s1.ax1x.com/2020/05/30/tMNjmR.png?invert=in-dark&amp;padding=true" referrerpolicy="no-referrer" alt="指定切换至 Dark 模式后反色后会长这样（指定了在 Dark 模式时反色）"></p><h6><a name="指定图片添加边缘空白" class="md-header-anchor"></a><span>指定图片添加边缘空白</span></h6><ul><li><span>对需要添加边缘空白的图片，可在图片 URL 增加启用边缘空白的参数</span><code>padding=true</code><span>；</span></li><li><span>举例： </span><code>![图片题注](xxxxx.png?padding=true)</code><span>；</span></li><li><span>以上两图图片已开启边缘空白，以适合图片内容过于贴边，无留白的情况。</span></li></ul><blockquote><p><span>[+] </span><strong><span>图片 URL 参数语法说明</span></strong></p><blockquote><ul><li><strong><span>图片 URL 无参数时：</span></strong><span>先在 URL 后添加英文问号</span><code>?</code><span>后，再添加需要的 URL 参数： </span><code>![图片题注](xxxxx.png?invert=in-dark)</code></li><li><strong><span>图片 URL 已有参数时：</span></strong><span>多个参数间用英文特殊符号</span><code>&amp;</code><span>进行分隔： </span><code>![图片题注](xxxxx.png?invert=in-dark&amp;padding=true)</code></li></ul></blockquote></blockquote><h3><a name="统一多级列表编号" class="md-header-anchor"></a><span>统一多级列表编号</span></h3><p><span>对所有</span><strong><span>有序</span></strong><span>、</span><strong><span>无序</span></strong><span>的多级列表编号进行了统一以有序编号为主，无序编号为辅，简化多级内容的编写。</span></p><blockquote><p><span>[+] </span><strong><span>列表分级编号样式效果</span></strong></p><blockquote><ul><li><p><span>一级列表内容</span></p></li><li><p><span>一级列表内容</span></p><ul><li><p><span>二级列表内容</span></p><ul><li><p><span>三级列表内容</span></p><ul><li><p><span>四级列表内容</span></p><ul><li><p><span>五级列表内容</span></p><ul><li><span>六级列表内容</span></li></ul></li></ul></li></ul></li></ul></li></ul></li><li><p><span>三级列表内容</span></p></li></ul></blockquote></blockquote><p><span>Markdown 原始内容参考如下：</span></p><pre spellcheck="false" class="md-fences md-end-block md-fences-with-lineno ty-contain-cm modeLoaded" lang="markdown"><div class="CodeMirror cm-s-inner CodeMirror-wrap" lang="markdown"><div style="overflow: hidden; position: relative; width: 3px; height: 0px; top: 0px; left: 38px;"><textarea autocorrect="off" autocapitalize="off" spellcheck="false" tabindex="0" style="position: absolute; bottom: -1em; padding: 0px; width: 1000px; height: 1em; outline: none;"></textarea></div><div class="CodeMirror-scrollbar-filler" cm-not-content="true"></div><div class="CodeMirror-gutter-filler" cm-not-content="true"></div><div class="CodeMirror-scroll" tabindex="-1"><div class="CodeMirror-sizer" style="margin-left: 28px; margin-bottom: 0px; border-right-width: 0px; padding-right: 0px; padding-bottom: 0px;"><div style="position: relative; top: 0px;"><div class="CodeMirror-lines" role="presentation"><div role="presentation" style="position: relative; outline: none;"><div class="CodeMirror-measure"><div class="CodeMirror-linenumber CodeMirror-gutter-elt"><div>9</div></div></div><div class="CodeMirror-measure"></div><div style="position: relative; z-index: 1;"></div><div class="CodeMirror-code" role="presentation" style=""><div class="CodeMirror-activeline" style="position: relative;"><div class="CodeMirror-activeline-background CodeMirror-linebackground"></div><div class="CodeMirror-gutter-background CodeMirror-activeline-gutter" style="left: -28px; width: 28px;"></div><div class="CodeMirror-gutter-wrapper CodeMirror-activeline-gutter" style="left: -28px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt CodeMirror-linenumber-show" style="left: 0px; width: 19px;">1</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-block-start cm-variable-2">- </span><span class="cm-variable-2">一级列表内容</span></span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -28px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 19px;">2</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; <span class="cm-block-start cm-variable-2">- </span><span class="cm-variable-2">二级列表内容</span></span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -28px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 19px;">3</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; <span class="cm-block-start cm-variable-2">- </span><span class="cm-variable-2">三级列表内容</span></span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -28px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 19px;">4</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; <span class="cm-block-start cm-variable-2">- </span><span class="cm-variable-2">四级列表内容</span></span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -28px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 19px;">5</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; <span class="cm-block-start cm-variable-2">- </span><span class="cm-variable-2">五级列表内容</span></span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -28px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 19px;">6</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="cm-block-start cm-variable-2">- </span><span class="cm-variable-2">六级列表内容</span></span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -28px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 19px;">7</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-block-start cm-variable-2">1. </span><span class="cm-variable-2">一级列表内容</span></span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -28px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 19px;">8</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; <span class="cm-block-start cm-variable-2">+ </span><span class="cm-variable-2">二级列表内容</span></span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -28px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt CodeMirror-linenumber-show" style="left: 0px; width: 19px;">9</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; <span class="cm-block-start cm-variable-2">- </span><span class="cm-variable-2">三级列表内容</span></span></pre></div></div></div></div></div></div><div style="position: absolute; height: 0px; width: 1px; border-bottom-width: 0px; border-bottom-style: solid; border-bottom-color: transparent; top: 252px;"></div><div class="CodeMirror-gutters" style="height: 252px; left: 0px;"><div class="CodeMirror-gutter CodeMirror-linenumbers" style="width: 27px;"></div></div></div></div></pre><h3><a name="任务列表支持自动编号" class="md-header-anchor"></a><span>任务列表支持自动编号</span></h3><p><span>GFM 标准的任务列表（to-do）默认会取消其列表编号。</span><br><span>VLOOK™ 主题会保持任务列表特性基础上，恢复列表编号的显示，并与上面</span><a href='#统一多级列表编号'><span>统一多级列表编号</span></a><span>保持一致。</span></p><p><strong><span>举例如下：</span></strong></p><ul><li class='md-task-list-item task-list-item task-list-not-done' ><input type='checkbox' disabled='disabled' /><p><span>这是一级任务列表项</span></p><ul><li class='md-task-list-item task-list-item task-list-not-done' ><input type='checkbox' disabled='disabled' /><p><span>这是二级任务列表项</span></p></li><li class='md-task-list-item task-list-item task-list-done' ><input type='checkbox' disabled='disabled' checked/><p><span>这是「已完成」的二级任务列表项</span></p><ul><li class='md-task-list-item task-list-item task-list-not-done' ><input type='checkbox' disabled='disabled' /><p><span>这是三级任务列表项</span></p></li></ul></li><li class='md-task-list-item task-list-item task-list-not-done' ><input type='checkbox' disabled='disabled' /><p><span>这是四级任务列表项</span></p><ul><li class='md-task-list-item task-list-item task-list-not-done' ><input type='checkbox' disabled='disabled' /><p><span>这是五级任务列表项</span></p><ul><li class='md-task-list-item task-list-item task-list-not-done' ><input type='checkbox' disabled='disabled' /><p><span>这是六级任务列表项</span></p></li></ul></li></ul></li><li class='md-task-list-item task-list-item task-list-not-done' ><input type='checkbox' disabled='disabled' /><p><span>这是二级任务列表项</span></p></li></ul></li><li class='md-task-list-item task-list-item task-list-not-done' ><input type='checkbox' disabled='disabled' /><p><span>这是一级任务列表项</span></p></li></ul><h2><a name="文档导航" class="md-header-anchor"></a><span>文档导航</span></h2><p><strong><span>VLOOK™ 提供了对文档章节、插图提供了多种形式的导航和快速定位的工具，全面改善和提高发布的 HTML 文件的浏览体验和效率。</span></strong>
<strong><span>敬请你根据需要和喜好随时、轻松享用～</span></strong></p><p><span>![文档导航工具及适用场景]</span></p><figure><table><thead><tr><th style='text-align:center;' ><strong><span>导航工具</span></strong></th><th><span>适用场景</span></th></tr></thead><tbody><tr><td style='text-align:center;' ><span>大纲导航</span></td><td><span>适用于目标明确，跨多个章节的快速定位</span></td></tr><tr><td style='text-align:center;' ><span>逐章导航</span></td><td><span>适用于前后章节相关度高，按章节顺序一章一章进行浏览</span></td></tr><tr><td style='text-align:center;' ><span>逐段导航</span></td><td><span>适用于文档评审或演示，按段落一段一段进行聚焦式浏览</span></td></tr><tr><td style='text-align:center;' ><span>插图导航</span></td><td><span>适用于按图索骥，通过浏览文档中的插图（图片、mermaid 图表）来直接跳到文档中对应的位置</span></td></tr></tbody></table></figure><h3><a name="大纲导航" class="md-header-anchor"></a><span>大纲导航</span></h3><p><span>在封面时，点击左上角的大纲按钮打开大纲导航面板。不在封面时，会自动贴在文档左侧固定显示大纲导航面板。</span><br><span>支持对章节进行折叠 / 展开。</span></p><p><code>#注意#</code><span>编写 Markdown 文档时，须在封面后添加目录标记</span><code>[TOC]</code><span>才能在导出的 HTML 中生成大纲面板。</span></p><h3><a name="逐章导航" class="md-header-anchor"></a><span>逐章导航</span></h3><p><span>进入文档正文区后，会自动在顶部显示逐章导航条，在封面时会自动收起隐藏，支持对 1~5 级章节进行逐章浏览。</span><br><span>从左到右分别为：</span><strong><span>前一章节</span></strong><span>、</span><strong><span>当前章节</span></strong><span>、</span><strong><span>后一章节</span></strong><span>，正如你现在看到顶部的导航栏那样。</span><br><span>鼠标点击对应的章节直接跳转到对应的章节开始位置，也可通过左 / 右方向键进行操作。</span></p><p><code>#注意#</code><span>编写 Markdown 文档时，须在封面后添加目录标记</span><code>[TOC]</code><span>才能在导出的 HTML 中生成逐章导航面板。</span></p><h3><a name="逐段导航" class="md-header-anchor"></a><span>逐段导航</span></h3><p><span>在进行</span><strong><span>文档评审或演示</span></strong><span>时，可以激活逐段导航，对单段内容进行聚焦。</span><br><span>通过鼠标双击文档任意段落激活逐段导航模式，并通过快捷键进行上 / 下改变当前聚焦的段落。</span></p><p><span>![逐段导航的浏览操作方式（致敬 VI / VIM）]</span></p><figure><table><thead><tr><th style='text-align:center;' ><span>快捷键</span></th><th><strong><span>功能</span></strong></th></tr></thead><tbody><tr><td style='text-align:center;' ><kbd><span>J</span></kbd></td><td><span>下一个段落</span></td></tr><tr><td style='text-align:center;' ><kbd><span>K</span></kbd></td><td><span>上一个段落</span></td></tr><tr><td style='text-align:center;' ><kbd><span>H</span></kbd></td><td><span>往前十个段落</span></td></tr><tr><td style='text-align:center;' ><kbd><span>L</span></kbd></td><td><span>往后十个段落</span></td></tr></tbody></table></figure><h3><a name="插图导航" class="md-header-anchor"></a><span>插图导航</span></h3><ul><li><span>点击任意插图可直接启动插图导航，或点击工具栏上的插图导航图标启动；</span></li><li><span>点击插图导航内的插图，能直接跳转到文档中对应的位置。</span></li></ul><blockquote><p><span>[+] </span><strong><span>支持的插图类型</span></strong></p><blockquote><ul><li><span>浏览器支持的所有图片（jpg / png / gif / bmp / ..）</span></li><li><span>脚本化图表（mermaid</span><sup class='md-footnote'><a href='#dfref-footnote-3' name='ref-footnote-3'>3</a></sup><span>，从</span><code>V9.0</code><span>开始移除对 flowchart.js</span><sup class='md-footnote'><a href='#dfref-footnote-4' name='ref-footnote-4'>4</a></sup><span>、JS Sequence Diagrams</span><sup class='md-footnote'><a href='#dfref-footnote-5' name='ref-footnote-5'>5</a></sup><span>的支持）</span></li></ul></blockquote></blockquote><h6><a name="这是长图片示例" class="md-header-anchor"></a><span>这是长图片示例：</span></h6><p><img src="https://tva1.sinaimg.cn/large/00831rSTgy1gct75k6v6rj30u00u0b2b.jpg" referrerpolicy="no-referrer" alt="普通的图片示例（长图会自动折叠）" title="（图片来源自互联网，版权尚不明确）"></p><h2><a name="演示辅助" class="md-header-anchor"></a><span>演示辅助</span></h2><p><strong><span>VLOOK™ 独创性地为 Markdown 导出的 HTML 提供了强大的演示辅助工具，让面向 Markdown 的 Typora + VLOOK 成为更具生产力的交互式文档出版工具。</span></strong></p><p><strong><span>非常适合现场和远程的演示辅助工具，敬请为你的 Markdown 开启 Turbo 模式～</span></strong></p><p><span>![演示辅助工具及适用场景]</span></p><figure><table><thead><tr><th style='text-align:center;' ><strong><span>演示辅助工具</span></strong></th><th><span>适用场景</span></th></tr></thead><tbody><tr><td style='text-align:center;' ><span>聚光灯</span></td><td><span>对局部内容进行聚焦，如：插图、多个段落内容</span></td></tr><tr><td style='text-align:center;' ><span>表格十字光柱</span></td><td><span>针对表格内容，特别是行 / 列关联性强的表格，快速关联任意单元格的横向、纵向单元格序列</span></td></tr><tr><td style='text-align:center;' ><span>新标签打开插图、表格、代码块</span></td><td><span>针对须频繁在多个插图、表格、代码块间进行切换时使用，大大减少不必要的文档内跳转</span></td></tr></tbody></table></figure><h3><a name="聚光灯" class="md-header-anchor"></a><span>聚光灯</span></h3><p><span>在进行文档评审或演示时，可以通过激活聚光灯来让观众聚焦于文档的特定区域和内容。</span></p><p><span>通过工具栏上的「聚光灯」按钮打开 / 关闭，也可通过快捷键 </span><kbd><span>S</span></kbd><span> 进行操作，同时还可以通过按下 </span><kbd><span>⇧ Shift</span></kbd><span> 键调节大小。</span></p><p><code>#小提示#tips</code><span>聚光灯在新标签打开的页面中也可以使用喔～</span></p><h3><a name="表格十字光柱" class="md-header-anchor"></a><span>表格十字光柱</span></h3><p><span>鼠标点击表格上的任意单元格后，会自动显示十字光柱，高亮其横向、纵向关联对应的单元格序。</span></p><p><a href='#表格单元格合并'><span>查看示例效果</span></a></p><p><code>#小提示#tips</code><span>表格十字光柱在新标签打开的页面中也可以使用喔～</span></p><h3><a name="在新标签打开插图表格代码块" class="md-header-anchor"></a><span>在新标签打开插图、表格、代码块</span></h3><p><span>支持在新标签中打开文档中的 </span><strong><span>插图</span></strong><span>、</span><strong><span>表格</span></strong><span>、</span><strong><span>代码块</span></strong><span>，鼠标悬念在这些文档内容上时会在左上角显示「在新标签打开」的按钮，点击即可。</span></p><p><a href='#表格单元格合并'><span>查看示例效果</span></a><span>。</span></p><h2><a name="内容互动" class="md-header-anchor"></a><span>内容互动</span></h2><p><strong><span>得益于成熟的浏览器、HTML / CSS、JavaScript 技术，让静态的文档也能与你「动」起来。</span></strong></p><h3><a name="支持音频视频" class="md-header-anchor"></a><span>支持音频、视频</span></h3><h4><a name="音频" class="md-header-anchor"></a><span>音频</span></h4><p><strong><span>支持的音频格式：MP3 (.mp3)、Ogg (.ogg)、Wav (.wav)、M4a (.m4a)</span></strong></p><p><span>语法与 Mardown 的插入图片保持一致（在标准模式控件时可支持</span><a href='#自动生成插图表格代码块音视频的题注'><span>自动题注</span></a><span>）。</span><br><span>语法：</span><code>![音频题注](音频URL &quot;音频第2题注&quot;)</code><span>，如：</span><code>![这是音频](audio.mp3)</code></p><h6><a name="音频播放控件默认为标准模式" class="md-header-anchor"></a><span>音频播放控件默认为：标准模式</span></h6><p><img src="media/waves_and_rocks.mp3" referrerpolicy="no-referrer" alt="音频播放控件默认为标准模式" title="(MP3 格式)"></p><h6><a name="音频播放控件可指定为mini-模式" class="md-header-anchor"></a><span>音频播放控件可指定为：Mini 模式</span></h6><p><img src="media/whistle.mp3?controls=mini" referrerpolicy="no-referrer"><span>   </span><strong><span>← 点击播放</span></strong></p><p><span>![音频内容支持定制的内容]</span></p><figure><table><thead><tr><th style='text-align:center;' ><strong><span>可定制特性</span></strong></th><th><span>URL 参数</span></th><th><span>示例</span></th></tr></thead><tbody><tr><td style='text-align:center;' ><span>启用 Mini 模式的播放控件</span></td><td><code>controls=mini</code></td><td><img src="media/whistle.mp3?controls=mini" referrerpolicy="no-referrer"></td></tr><tr><td style='text-align:center;' ><span>启用 播放/暂时 模式</span><br><sub><strong><span>（默认为 播放/结束）</span></strong></sub></td><td><code>pause=true</code><br><sub><code>#注意#</code><strong><span>仅 Mini 模式下有效</span></strong></sub></td><td><img src="media/whistle.mp3?controls=mini&amp;pause=true" referrerpolicy="no-referrer"></td></tr><tr><td style='text-align:center;' ><span>显示音频时长</span></td><td><code>duration=true</code><br><sub><code>#注意#</code><strong><span>仅 Mini 模式下有效</span></strong></sub></td><td><img src="media/waves_and_rocks.mp3?controls=mini&amp;duration=true" referrerpolicy="no-referrer"></td></tr><tr><td style='text-align:center;' ><span>开启自动播放</span></td><td><code>autoplay=true</code></td><td><img src="media/whistle.mp3?controls=mini&amp;autoplay=true" referrerpolicy="no-referrer"></td></tr><tr><td style='text-align:center;' ><span>开启循环播放</span></td><td><code>loop=true</code></td><td><img src="media/whistle.mp3?loop=true" referrerpolicy="no-referrer" alt="循环播放音频示例"></td></tr><tr><td style='text-align:center;' ><span>开启预加载</span></td><td><code>preload=true</code></td><td><img src="media/whistle.ogg?preload=true" referrerpolicy="no-referrer" alt="预加载音频示例" title="(OGG 格式)"></td></tr></tbody></table></figure><blockquote><p><span>[+] </span><strong><span>音频 URL 参数语法说明</span></strong></p><blockquote><ul><li><strong><span>音频 URL 无参数时：</span></strong><span>先在 URL 后添加英文问号</span><code>?</code><span>后，再添加需要的 URL 参数： </span><code>![音频题注](xxxxx.mp3?controls=mini)</code></li><li><strong><span>音频 URL 已有参数时：</span></strong><span>多个参数间用英文特殊符号</span><code>&amp;</code><span>进行分隔： </span><code>![音频题注](xxxxx.ogg?controls=mini&amp;loop=true)</code></li></ul></blockquote></blockquote><h4><a name="视频" class="md-header-anchor"></a><span>视频</span></h4><p><strong><span>支持的格式：Ogg (.ogv)、MPEG4 (.mp4)、WebM (.webm)</span></strong></p><p><span>语法与 Mardown 的插入图片保持一致，可支持</span><a href='#自动生成插图表格代码块音视频的题注'><span>自动题注</span></a><span>。</span><br><span>语法：</span><code>![视频题注](音频URL &quot;视频第2题注&quot;)</code><span>，如：</span><code>![这是视频](video.webm)</code></p><p><img src="media/a_sky_full_of_stars-480p.webm" referrerpolicy="no-referrer" alt="视频示例" title="(WebM 格式视频)"></p><p><span>![视频内容支持定制的内容]</span></p><figure><table><thead><tr><th style='text-align:center;' ><strong><span>可定制特性</span></strong></th><th><span>URL 参数</span></th><th><span>示例</span></th></tr></thead><tbody><tr><td style='text-align:center;' ><span>开启自动播放</span></td><td><code>autoplay=true</code></td><td>&nbsp;</td></tr><tr><td style='text-align:center;' ><span>开启循环播放</span></td><td><code>loop=true</code></td><td>&nbsp;</td></tr><tr><td style='text-align:center;' ><span>开启预加载</span></td><td><code>preload=true</code></td><td><img src="media/a_sky_full_of_stars-480p.webm?preload=true&amp;height=240" referrerpolicy="no-referrer" alt="预加载视频示例" title="(指定为240p)"></td></tr><tr><td style='text-align:center;' ><span>指定视频宽度</span></td><td><code>width=xxx</code></td><td><span>指定视频的宽度（单位：px）</span></td></tr><tr><td style='text-align:center;' ><span>指定视频高度</span></td><td><code>height=xxx</code></td><td><span>指定视频的高度（单位：px）</span></td></tr></tbody></table></figure><p><code>#提示#tips</code><span>视频 URL 参数语法与音频一致</span></p><h3><a name="代码块增强" class="md-header-anchor"></a><span>代码块增强</span></h3><p><span>更实用、更美观的代码块样式，支持高亮当前行、一键复制代码，还能自动适配 </span><a href='#dark-模式'><span>Dark 模式</span></a><span>。</span></p><p><code>#注意#</code><span>须先启用显示代码块行号配置。启用方式：「Typora → 文件 → 偏好设置 → Markdown → 代码块 - 显示行号」</span></p><p><span>![VLOOK™ 的代码块示例]&quot;语法着色器: C++&quot;</span></p><pre spellcheck="false" class="md-fences md-end-block md-fences-with-lineno ty-contain-cm modeLoaded" lang="c++" style="break-inside: unset;"><div class="CodeMirror cm-s-inner CodeMirror-wrap" lang="c++"><div style="overflow: hidden; position: relative; width: 3px; height: 0px; top: 0px; left: 46px;"><textarea autocorrect="off" autocapitalize="off" spellcheck="false" tabindex="0" style="position: absolute; bottom: -1em; padding: 0px; width: 1000px; height: 1em; outline: none;"></textarea></div><div class="CodeMirror-scrollbar-filler" cm-not-content="true"></div><div class="CodeMirror-gutter-filler" cm-not-content="true"></div><div class="CodeMirror-scroll" tabindex="-1"><div class="CodeMirror-sizer" style="margin-left: 36px; margin-bottom: 0px; border-right-width: 0px; padding-right: 0px; padding-bottom: 0px;"><div style="position: relative; top: 0px;"><div class="CodeMirror-lines" role="presentation"><div role="presentation" style="position: relative; outline: none;"><div class="CodeMirror-measure"><div class="CodeMirror-linenumber CodeMirror-gutter-elt"><div>37</div></div></div><div class="CodeMirror-measure"></div><div style="position: relative; z-index: 1;"></div><div class="CodeMirror-code" role="presentation" style=""><div class="CodeMirror-activeline" style="position: relative;"><div class="CodeMirror-activeline-background CodeMirror-linebackground"></div><div class="CodeMirror-gutter-background CodeMirror-activeline-gutter" style="left: -36px; width: 36px;"></div><div class="CodeMirror-gutter-wrapper CodeMirror-activeline-gutter" style="left: -36px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt CodeMirror-linenumber-show" style="left: 0px; width: 27px;">1</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-comment">// ================================================== //</span></span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -36px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">2</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-comment">// &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  VLOOK™ 支持对长代码块进行自动折叠 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //</span></span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -36px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">3</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-comment">// ================================================== //</span></span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -36px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">4</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="">​</span></span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -36px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">5</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-comment">/**</span></span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -36px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">6</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-comment">* 快速排序</span></span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -36px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">7</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-comment">* @param arr 排序的目标数据</span></span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -36px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">8</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-comment">* @param left 排序范围左值</span></span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -36px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">9</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-comment">* @param right 排序范围右值</span></span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -36px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt CodeMirror-linenumber-show" style="left: 0px; width: 27px;">10</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-comment">*/</span></span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -36px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">11</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-variable-3">void</span> <span class="cm-def">quickSort</span>(<span class="cm-variable-3">int</span> <span class="cm-variable">arr</span>[], <span class="cm-variable-3">int</span> <span class="cm-variable">left</span>, <span class="cm-variable-3">int</span> <span class="cm-variable">right</span>) {</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -36px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">12</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-variable-3">int</span> <span class="cm-variable">i</span> <span class="cm-operator">=</span> <span class="cm-variable">left</span>, <span class="cm-variable">j</span> <span class="cm-operator">=</span> <span class="cm-variable">right</span>, <span class="cm-variable">tmp</span>, <span class="cm-variable">pivot</span> <span class="cm-operator">=</span> <span class="cm-variable">arr</span>[(<span class="cm-variable">left</span> <span class="cm-operator">+</span> <span class="cm-variable">right</span>) <span class="cm-operator">/</span> <span class="cm-number">2</span>];</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -36px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">13</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp;</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -36px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">14</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-comment">/* partition */</span></span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -36px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">15</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-keyword">while</span> (<span class="cm-variable">i</span> <span class="cm-operator">&lt;=</span> <span class="cm-variable">j</span>) {</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -36px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">16</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">while</span> (<span class="cm-variable">arr</span>[<span class="cm-variable">i</span>] <span class="cm-operator">&lt;</span> <span class="cm-variable">pivot</span>)</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -36px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">17</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">i</span><span class="cm-operator">++</span>;</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -36px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">18</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">while</span> (<span class="cm-variable">arr</span>[<span class="cm-variable">j</span>] <span class="cm-operator">&gt;</span> <span class="cm-variable">pivot</span>)</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -36px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">19</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">j</span><span class="cm-operator">--</span>;</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -36px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt CodeMirror-linenumber-show" style="left: 0px; width: 27px;">20</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-variable">i</span> <span class="cm-operator">&lt;=</span> <span class="cm-variable">j</span>) {</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -36px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">21</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">tmp</span> <span class="cm-operator">=</span> <span class="cm-variable">arr</span>[<span class="cm-variable">i</span>];</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -36px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">22</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">arr</span>[<span class="cm-variable">i</span>] <span class="cm-operator">=</span> <span class="cm-variable">arr</span>[<span class="cm-variable">j</span>];</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -36px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">23</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">arr</span>[<span class="cm-variable">j</span>] <span class="cm-operator">=</span> <span class="cm-variable">tmp</span>;</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -36px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">24</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">i</span><span class="cm-operator">++</span>;</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -36px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">25</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">j</span><span class="cm-operator">--</span>;</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -36px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">26</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp;  }</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -36px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">27</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp;  };</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -36px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">28</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="">​</span></span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -36px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">29</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-comment">/* recursion */</span></span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -36px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt CodeMirror-linenumber-show" style="left: 0px; width: 27px;">30</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-variable">left</span> <span class="cm-operator">&lt;</span> <span class="cm-variable">j</span>)</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -36px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">31</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">quickSort</span>(<span class="cm-variable">arr</span>, <span class="cm-variable">left</span>, <span class="cm-variable">j</span>);</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -36px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">32</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="">​</span></span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -36px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">33</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-variable">i</span> <span class="cm-operator">&lt;</span> <span class="cm-variable">right</span>)</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -36px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">34</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">quickSort</span>(<span class="cm-variable">arr</span>, <span class="cm-variable">i</span>, <span class="cm-variable">right</span>);</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -36px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">35</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;">}</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -36px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 27px;">36</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="">​</span></span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -36px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt CodeMirror-linenumber-show" style="left: 0px; width: 27px;">37</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-comment">// ================================================== //</span></span></pre></div></div></div></div></div></div><div style="position: absolute; height: 0px; width: 1px; border-bottom-width: 0px; border-bottom-style: solid; border-bottom-color: transparent; top: 1036px;"></div><div class="CodeMirror-gutters" style="height: 1036px; left: 0px;"><div class="CodeMirror-gutter CodeMirror-linenumbers" style="width: 35px;"></div></div></div></div></pre><h3><a name="引用内容可设置为折叠" class="md-header-anchor"></a><span>引用内容可设置为折叠</span></h3><p><span>对 Markdown 「引用」</span><code>&gt; 引用内容</code><span>进行简单的扩展，实现对引用内容的动态的折叠 / 展开操作，还可以设置默认姿势是折叠，还是展开。</span></p><p><strong><span>举例如下：</span></strong></p><blockquote><p><span>[+] </span><strong><span>以下是默认折叠的「引用」内容</span></strong></p><blockquote><ul><li><p><span>在作为折叠引子的内容前增加：</span><code>[+]&lt;空格&gt;</code><span>或</span><code>[-]&lt;空格&gt;</code></p><ul><li><code>[+]</code><span>指该标题下的引用内容默认为「收起」状态；</span></li><li><code>[-]</code><span>指该标题下的引用内容默认为「展开」状态；</span></li></ul></li><li><p><span>然后换行后添加一个新的嵌套的引用块，该嵌套的引用块即为该引子对应要折叠 / 展开的内容。</span></p></li></ul><p><span>[+] </span><strong><span>可支持多重引用的折叠</span></strong></p><blockquote><p><span>[+] </span><strong><span>这里是第三重引用折叠的内容</span></strong></p><blockquote><p><span>这是第三重引用的内容</span></p></blockquote></blockquote></blockquote><p><span>[-] </span><strong><span>以下是是默认展开的「引用」内容</span></strong></p><blockquote><p><span>默认为展示的引用内容</span></p></blockquote></blockquote><p><span>扩展的 Markdown 语法参考如下：</span></p><pre spellcheck="false" class="md-fences md-end-block md-fences-with-lineno ty-contain-cm modeLoaded" lang="markdown"><div class="CodeMirror cm-s-inner CodeMirror-wrap" lang="markdown"><div style="overflow: hidden; position: relative; width: 3px; height: 0px; top: 0px; left: 38px;"><textarea autocorrect="off" autocapitalize="off" spellcheck="false" tabindex="0" style="position: absolute; bottom: -1em; padding: 0px; width: 1000px; height: 1em; outline: none;"></textarea></div><div class="CodeMirror-scrollbar-filler" cm-not-content="true"></div><div class="CodeMirror-gutter-filler" cm-not-content="true"></div><div class="CodeMirror-scroll" tabindex="-1"><div class="CodeMirror-sizer" style="margin-left: 28px; margin-bottom: 0px; border-right-width: 0px; padding-right: 0px; padding-bottom: 0px;"><div style="position: relative; top: 0px;"><div class="CodeMirror-lines" role="presentation"><div role="presentation" style="position: relative; outline: none;"><div class="CodeMirror-measure"><div class="CodeMirror-linenumber CodeMirror-gutter-elt"><div>3</div></div></div><div class="CodeMirror-measure"></div><div style="position: relative; z-index: 1;"></div><div class="CodeMirror-code" role="presentation"><div class="CodeMirror-activeline" style="position: relative;"><div class="CodeMirror-activeline-background CodeMirror-linebackground"></div><div class="CodeMirror-gutter-background CodeMirror-activeline-gutter" style="left: -28px; width: 28px;"></div><div class="CodeMirror-gutter-wrapper CodeMirror-activeline-gutter" style="left: -28px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt CodeMirror-linenumber-show" style="left: 0px; width: 19px;">1</div></div><pre class=" cm-atom CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class=" cm-block-start cm-atom">&gt; </span><span class=" cm-atom">[+] 我是折叠的引子</span></span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -28px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 19px;">2</div></div><pre class=" cm-atom CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class=" cm-block-start cm-number">&gt; &gt; </span><span class=" cm-number">我是被折叠的内容</span></span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -28px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt CodeMirror-linenumber-show" style="left: 0px; width: 19px;">3</div></div><pre class=" cm-atom CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class=" cm-block-start cm-number">&gt; &gt; </span><span class=" cm-number">我是被折叠的内容</span></span></pre></div></div></div></div></div></div><div style="position: absolute; height: 0px; width: 1px; border-bottom-width: 0px; border-bottom-style: solid; border-bottom-color: transparent; top: 84px;"></div><div class="CodeMirror-gutters" style="height: 84px; left: 0px;"><div class="CodeMirror-gutter CodeMirror-linenumbers" style="width: 27px;"></div></div></div></div></pre><p>&nbsp;</p><h3><a name="长内容自动折叠" class="md-header-anchor"></a><span>长内容自动折叠</span></h3><p><span>文档中的长插图、长表格、长代码会占用过多的屏幕空间，通过 VLOOK™ 可以实现对这些长内容的自动折叠；</span></p><p><strong><span>• 长图片</span></strong><span>（</span><a href='#这是长图片示例'><span>查看示例</span></a><span>）</span></p><p><strong><span>• 长的表格</span></strong><span>（</span><a href='#特性清单'><span>查看示例</span></a><span>）</span></p><p><strong><span>• 长代码</span></strong><span>（</span><a href='#代码块增强'><span>查看示例</span></a><span>）</span></p><h3><a name="文档内容检查与优化" class="md-header-anchor"></a><span>文档内容检查与优化</span></h3><h6><a name="自动识别缺失的图片" class="md-header-anchor"></a><span>自动识别缺失的图片</span></h6><p><span>识别出无法加载的图片，并替换为图片缺失提示图，示例如下：</span></p><p><img src="vlook-lost-image.jpg?invert=in-dark" referrerpolicy="no-referrer" alt="缺失的图片"></p><p>&nbsp;</p><h6><a name="页内链接检查" class="md-header-anchor"></a><span>页内链接检查</span></h6><p><span>自动检查页面内部链接的正确性，若存在无效的页内链接，则通过弹窗提示。</span></p><p>&nbsp;</p><h6><a name="重名章节标题检查" class="md-header-anchor"></a><span>重名章节标题检查</span></h6><p><span>自动检查文档是否存在重名的标题，以提示作者检查是否会存在页内链接不能跳转到重名的标题位置的可能性。</span></p><p><code>#注意#</code><span>重名章节标题的警告提示信息须启动浏览器的开发者工具或调试工具后，打开其控制台窗口进行查看。</span></p><p>&nbsp;</p><h6><a name="外部链接强制在新标签打开" class="md-header-anchor"></a><span>外部链接强制在新标签打开</span></h6><p><span>为提高文档阅读与交互体验，对于外链（如：http、https、ftp等），自动强制设置为在新标签页中打开。</span></p><h2><a name="视觉与交互" class="md-header-anchor"></a><span>视觉与交互</span></h2><p><span>「</span><strong><span>人类从来都是视觉动物，自己或他人在阅读时，让眼睛感受愉悦和美好，是一种美德、一种力量、一种信仰。</span></strong><span>」</span></p><p><span>　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　── MAX丨孟兆</span></p><h3><a name="dark-模式" class="md-header-anchor"></a><span>Dark 模式</span></h3><p><span>所有 VLOOK™ 的主题，都会自动根据浏览器的配置，自动适配显示 Light / Dark 模式，也支持手动方式进行切换。</span></p><p><img src="https://s1.ax1x.com/2020/05/08/YueXpq.png" referrerpolicy="no-referrer" alt="Light / Dark 效果预览" title="（← Light / → Dark）"></p><p><code>#提示#tips</code><span>如果你的图片在 Dark 模式下显得不够和谐，可以尝试选择</span><a href='#图片反色增加边缘空白'><span>让图片在 Dark 模式时自动反色</span></a><span>。</span></p><h3><a name="字体风格选择" class="md-header-anchor"></a><span>字体风格选择</span></h3><p><span>支持 </span><strong><span>衬线</span></strong><span> 与 </span><strong><span>非衬线</span></strong><span> 两套字体风格，可根据个人喜好进行切换，后续将会引入更多字体风格。</span></p><p><span>衬线与非衬线分别优先使用开源的 </span><strong><span>思源黑体</span></strong><span> 和 </span><strong><span>思源宋体</span></strong><span>，建议下载安装获得最佳的视觉体验。</span></p><blockquote><p><span>[+] </span><strong><span>字体下载地址</span></strong></p><blockquote><ul><li><span>思源黑体 / Noto Sans（</span><a href='https://github.com/googlefonts/noto-cjk/blob/master/NotoSansCJKsc-Regular.otf'><span>常规体</span></a><span>、</span><a href='https://github.com/googlefonts/noto-cjk/blob/master/NotoSansCJKsc-Bold.otf'><span>粗体</span></a><span>）</span></li><li><span>思源宋体 / Noto Serif（</span><a href='https://github.com/googlefonts/noto-cjk/blob/master/NotoSerifCJKsc-Regular.otf'><span>常规体</span></a><span>、</span><a href='https://github.com/googlefonts/noto-cjk/blob/master/NotoSerifCJKsc-Bold.otf'><span>粗体</span></a><span>）</span></li></ul></blockquote></blockquote><h3><a name="更友好的脚注" class="md-header-anchor"></a><span>更友好的脚注</span></h3><p><span>默认情况下，Typora 导出的 HTML 在查看脚注时会在文档中来回跳转。</span></p><p><span>通过 VLOOK™ 插件优化后的脚注，可以直接在当前页面位置弹层的方式进行显示，可点击文末右上角的链接查看效果</span><sup class='md-footnote'><a href='#dfref-footnote-6' name='ref-footnote-6'>6</a></sup></p><h3><a name="更美观的公式" class="md-header-anchor"></a><span>更美观的公式</span></h3><h6><a name="行内公式" class="md-header-anchor"></a><span>行内公式</span></h6><p><span class="MathJax_SVG" tabindex="-1" style="font-size: 100%; display: inline-block;"><svg xmlns:xlink="http://www.w3.org/1999/xlink" width="19.4ex" height="2.443ex" viewBox="0 -788 8352.6 1052" role="img" focusable="false" style="vertical-align: -0.613ex;"><defs><path stroke-width="0" id="E5-MJMAIN-6C" d="M42 46H56Q95 46 103 60V68Q103 77 103 91T103 124T104 167T104 217T104 272T104 329Q104 366 104 407T104 482T104 542T103 586T103 603Q100 622 89 628T44 637H26V660Q26 683 28 683L38 684Q48 685 67 686T104 688Q121 689 141 690T171 693T182 694H185V379Q185 62 186 60Q190 52 198 49Q219 46 247 46H263V0H255L232 1Q209 2 183 2T145 3T107 3T57 1L34 0H26V46H42Z"></path><path stroke-width="0" id="E5-MJMAIN-69" d="M69 609Q69 637 87 653T131 669Q154 667 171 652T188 609Q188 579 171 564T129 549Q104 549 87 564T69 609ZM247 0Q232 3 143 3Q132 3 106 3T56 1L34 0H26V46H42Q70 46 91 49Q100 53 102 60T104 102V205V293Q104 345 102 359T88 378Q74 385 41 385H30V408Q30 431 32 431L42 432Q52 433 70 434T106 436Q123 437 142 438T171 441T182 442H185V62Q190 52 197 50T232 46H255V0H247Z"></path><path stroke-width="0" id="E5-MJMAIN-6D" d="M41 46H55Q94 46 102 60V68Q102 77 102 91T102 122T103 161T103 203Q103 234 103 269T102 328V351Q99 370 88 376T43 385H25V408Q25 431 27 431L37 432Q47 433 65 434T102 436Q119 437 138 438T167 441T178 442H181V402Q181 364 182 364T187 369T199 384T218 402T247 421T285 437Q305 442 336 442Q351 442 364 440T387 434T406 426T421 417T432 406T441 395T448 384T452 374T455 366L457 361L460 365Q463 369 466 373T475 384T488 397T503 410T523 422T546 432T572 439T603 442Q729 442 740 329Q741 322 741 190V104Q741 66 743 59T754 49Q775 46 803 46H819V0H811L788 1Q764 2 737 2T699 3Q596 3 587 0H579V46H595Q656 46 656 62Q657 64 657 200Q656 335 655 343Q649 371 635 385T611 402T585 404Q540 404 506 370Q479 343 472 315T464 232V168V108Q464 78 465 68T468 55T477 49Q498 46 526 46H542V0H534L510 1Q487 2 460 2T422 3Q319 3 310 0H302V46H318Q379 46 379 62Q380 64 380 200Q379 335 378 343Q372 371 358 385T334 402T308 404Q263 404 229 370Q202 343 195 315T187 232V168V108Q187 78 188 68T191 55T200 49Q221 46 249 46H265V0H257L234 1Q210 2 183 2T145 3Q42 3 33 0H25V46H41Z"></path><path stroke-width="0" id="E5-MJMATHI-78" d="M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z"></path><path stroke-width="0" id="E5-MJMAIN-2192" d="M56 237T56 250T70 270H835Q719 357 692 493Q692 494 692 496T691 499Q691 511 708 511H711Q720 511 723 510T729 506T732 497T735 481T743 456Q765 389 816 336T935 261Q944 258 944 250Q944 244 939 241T915 231T877 212Q836 186 806 152T761 85T740 35T732 4Q730 -6 727 -8T711 -11Q691 -11 691 0Q691 7 696 25Q728 151 835 230H70Q56 237 56 250Z"></path><path stroke-width="0" id="E5-MJMAIN-221E" d="M55 217Q55 305 111 373T254 442Q342 442 419 381Q457 350 493 303L507 284L514 294Q618 442 747 442Q833 442 888 374T944 214Q944 128 889 59T743 -11Q657 -11 580 50Q542 81 506 128L492 147L485 137Q381 -11 252 -11Q166 -11 111 57T55 217ZM907 217Q907 285 869 341T761 397Q740 397 720 392T682 378T648 359T619 335T594 310T574 285T559 263T548 246L543 238L574 198Q605 158 622 138T664 94T714 61T765 51Q827 51 867 100T907 217ZM92 214Q92 145 131 89T239 33Q357 33 456 193L425 233Q364 312 334 337Q285 380 233 380Q171 380 132 331T92 214Z"></path><path stroke-width="0" id="E5-MJMAIN-65" d="M28 218Q28 273 48 318T98 391T163 433T229 448Q282 448 320 430T378 380T406 316T415 245Q415 238 408 231H126V216Q126 68 226 36Q246 30 270 30Q312 30 342 62Q359 79 369 104L379 128Q382 131 395 131H398Q415 131 415 121Q415 117 412 108Q393 53 349 21T250 -11Q155 -11 92 58T28 218ZM333 275Q322 403 238 411H236Q228 411 220 410T195 402T166 381T143 340T127 274V267H333V275Z"></path><path stroke-width="0" id="E5-MJMAIN-78" d="M201 0Q189 3 102 3Q26 3 17 0H11V46H25Q48 47 67 52T96 61T121 78T139 96T160 122T180 150L226 210L168 288Q159 301 149 315T133 336T122 351T113 363T107 370T100 376T94 379T88 381T80 383Q74 383 44 385H16V431H23Q59 429 126 429Q219 429 229 431H237V385Q201 381 201 369Q201 367 211 353T239 315T268 274L272 270L297 304Q329 345 329 358Q329 364 327 369T322 376T317 380T310 384L307 385H302V431H309Q324 428 408 428Q487 428 493 431H499V385H492Q443 385 411 368Q394 360 377 341T312 257L296 236L358 151Q424 61 429 57T446 50Q464 46 499 46H516V0H510H502Q494 1 482 1T457 2T432 2T414 3Q403 3 377 3T327 1L304 0H295V46H298Q309 46 320 51T331 63Q331 65 291 120L250 175Q249 174 219 133T185 88Q181 83 181 74Q181 63 188 55T206 46Q208 46 208 23V0H201Z"></path><path stroke-width="0" id="E5-MJMAIN-70" d="M36 -148H50Q89 -148 97 -134V-126Q97 -119 97 -107T97 -77T98 -38T98 6T98 55T98 106Q98 140 98 177T98 243T98 296T97 335T97 351Q94 370 83 376T38 385H20V408Q20 431 22 431L32 432Q42 433 61 434T98 436Q115 437 135 438T165 441T176 442H179V416L180 390L188 397Q247 441 326 441Q407 441 464 377T522 216Q522 115 457 52T310 -11Q242 -11 190 33L182 40V-45V-101Q182 -128 184 -134T195 -145Q216 -148 244 -148H260V-194H252L228 -193Q205 -192 178 -192T140 -191Q37 -191 28 -194H20V-148H36ZM424 218Q424 292 390 347T305 402Q234 402 182 337V98Q222 26 294 26Q345 26 384 80T424 218Z"></path><path stroke-width="0" id="E5-MJMAIN-2212" d="M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z"></path><path stroke-width="0" id="E5-MJMAIN-3D" d="M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z"></path><path stroke-width="0" id="E5-MJMAIN-30" d="M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z"></path></defs><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="matrix(1 0 0 -1 0 0)"><use xlink:href="#E5-MJMAIN-6C"></use><use xlink:href="#E5-MJMAIN-69" x="278" y="0"></use><use xlink:href="#E5-MJMAIN-6D" x="556" y="0"></use><g transform="translate(1389,-150)"><use transform="scale(0.707)" xlink:href="#E5-MJMATHI-78" x="0" y="0"></use><use transform="scale(0.707)" xlink:href="#E5-MJMAIN-2192" x="572" y="0"></use><use transform="scale(0.707)" xlink:href="#E5-MJMAIN-221E" x="1572" y="0"></use></g><g transform="translate(3474,0)"><use xlink:href="#E5-MJMAIN-65"></use><use xlink:href="#E5-MJMAIN-78" x="444" y="0"></use><use xlink:href="#E5-MJMAIN-70" x="972" y="0"></use></g><g transform="translate(5169,0)"><use xlink:href="#E5-MJMAIN-2212" x="0" y="0"></use><use xlink:href="#E5-MJMATHI-78" x="778" y="0"></use></g><use xlink:href="#E5-MJMAIN-3D" x="6796" y="0"></use><use xlink:href="#E5-MJMAIN-30" x="7852" y="0"></use></g></svg></span><script type="math/tex">\lim_{x \to \infty} \exp{-x}=0</script></p><p>&nbsp;</p><h6><a name="多行公式" class="md-header-anchor"></a><span>多行公式</span></h6><div contenteditable="false" spellcheck="false" class="mathjax-block md-end-block md-math-block md-rawblock" id="mathjax-n947" cid="n947" mdtype="math_block">
			
		<div class="md-rawblock-container md-math-container" tabindex="-1"><div class="MathJax_SVG_Display"><span class="MathJax_SVG" id="MathJax-Element-3-Frame" tabindex="-1" style="font-size: 100%; display: inline-block;"><svg xmlns:xlink="http://www.w3.org/1999/xlink" width="164.544ex" height="10.841ex" viewBox="0 -2569.6 70844.9 4667.6" role="img" focusable="false" style="vertical-align: -4.873ex; max-width: 100%;"><defs><path stroke-width="0" id="E4-MJMAIN-28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z"></path><path stroke-width="0" id="E4-MJMAIN-31" d="M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z"></path><path stroke-width="0" id="E4-MJMAIN-29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z"></path><path stroke-width="0" id="E4-MJMAINB-56" d="M592 686H604Q615 685 631 685T666 684T700 684T724 683Q829 683 835 686H843V624H744L611 315Q584 254 546 165Q492 40 482 19T461 -6L460 -7H409Q398 -4 391 9Q385 20 257 315L124 624H25V686H36Q57 683 190 683Q340 683 364 686H377V624H289L384 403L480 185L492 212Q504 240 529 298T575 405L670 624H582V686H592Z"></path><path stroke-width="0" id="E4-MJMAIN-D7" d="M630 29Q630 9 609 9Q604 9 587 25T493 118L389 222L284 117Q178 13 175 11Q171 9 168 9Q160 9 154 15T147 29Q147 36 161 51T255 146L359 250L255 354Q174 435 161 449T147 471Q147 480 153 485T168 490Q173 490 175 489Q178 487 284 383L389 278L493 382Q570 459 587 475T609 491Q630 491 630 471Q630 464 620 453T522 355L418 250L522 145Q606 61 618 48T630 29Z"></path><path stroke-width="0" id="E4-MJMAIN-32" d="M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z"></path><path stroke-width="0" id="E4-MJMAIN-3D" d="M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z"></path><path stroke-width="0" id="E4-MJMAIN-7C" d="M139 -249H137Q125 -249 119 -235V251L120 737Q130 750 139 750Q152 750 159 735V-235Q151 -249 141 -249H139Z"></path><path stroke-width="0" id="E4-MJMAINB-69" d="M72 610Q72 649 98 672T159 695Q193 693 217 670T241 610Q241 572 217 549T157 525Q120 525 96 548T72 610ZM46 442L136 446L226 450H232V62H294V0H286Q271 3 171 3Q67 3 49 0H40V62H109V209Q109 358 108 362Q103 380 55 380H43V442H46Z"></path><path stroke-width="0" id="E4-MJMAINB-6A" d="M104 610Q104 649 130 672T191 695Q225 693 249 670T273 610Q273 572 249 549T189 525Q152 525 128 548T104 610ZM78 442L173 446L268 450H274V196Q274 -5 274 -37T269 -83Q256 -132 201 -166T71 -200Q10 -200 -30 -173T-71 -102Q-71 -70 -51 -51T-1 -31Q27 -31 48 -49T69 -100Q69 -121 53 -147H56Q66 -149 77 -149H80Q90 -149 100 -146T127 -125T149 -73Q151 -55 151 149V362Q150 364 148 366T145 370T142 373T138 375T133 377T124 378T113 379T97 380H75V442H78Z"></path><path stroke-width="0" id="E4-MJMAINB-6B" d="M32 686L123 690Q214 694 215 694H221V255L377 382H346V444H355Q370 441 476 441Q544 441 556 444H562V382H476L347 277L515 62H587V0H579Q564 3 476 3Q370 3 352 0H343V62H358L373 63L260 206L237 189L216 172V62H285V0H277Q259 3 157 3Q46 3 37 0H29V62H98V332Q98 387 98 453T99 534Q99 593 97 605T83 620Q69 624 42 624H29V686H32Z"></path><path stroke-width="0" id="E4-MJMAIN-2202" d="M202 508Q179 508 169 520T158 547Q158 557 164 577T185 624T230 675T301 710L333 715H345Q378 715 384 714Q447 703 489 661T549 568T566 457Q566 362 519 240T402 53Q321 -22 223 -22Q123 -22 73 56Q42 102 42 148V159Q42 276 129 370T322 465Q383 465 414 434T455 367L458 378Q478 461 478 515Q478 603 437 639T344 676Q266 676 223 612Q264 606 264 572Q264 547 246 528T202 508ZM430 306Q430 372 401 400T333 428Q270 428 222 382Q197 354 183 323T150 221Q132 149 132 116Q132 21 232 21Q244 21 250 22Q327 35 374 112Q389 137 409 196T430 306Z"></path><path stroke-width="0" id="E4-MJMATHI-58" d="M42 0H40Q26 0 26 11Q26 15 29 27Q33 41 36 43T55 46Q141 49 190 98Q200 108 306 224T411 342Q302 620 297 625Q288 636 234 637H206Q200 643 200 645T202 664Q206 677 212 683H226Q260 681 347 681Q380 681 408 681T453 682T473 682Q490 682 490 671Q490 670 488 658Q484 643 481 640T465 637Q434 634 411 620L488 426L541 485Q646 598 646 610Q646 628 622 635Q617 635 609 637Q594 637 594 648Q594 650 596 664Q600 677 606 683H618Q619 683 643 683T697 681T738 680Q828 680 837 683H845Q852 676 852 672Q850 647 840 637H824Q790 636 763 628T722 611T698 593L687 584Q687 585 592 480L505 384Q505 383 536 304T601 142T638 56Q648 47 699 46Q734 46 734 37Q734 35 732 23Q728 7 725 4T711 1Q708 1 678 1T589 2Q528 2 496 2T461 1Q444 1 444 10Q444 11 446 25Q448 35 450 39T455 44T464 46T480 47T506 54Q523 62 523 64Q522 64 476 181L429 299Q241 95 236 84Q232 76 232 72Q232 53 261 47Q262 47 267 47T273 46Q276 46 277 46T280 45T283 42T284 35Q284 26 282 19Q279 6 276 4T261 1Q258 1 243 1T201 2T142 2Q64 2 42 0Z"></path><path stroke-width="0" id="E4-MJMATHI-75" d="M21 287Q21 295 30 318T55 370T99 420T158 442Q204 442 227 417T250 358Q250 340 216 246T182 105Q182 62 196 45T238 27T291 44T328 78L339 95Q341 99 377 247Q407 367 413 387T427 416Q444 431 463 431Q480 431 488 421T496 402L420 84Q419 79 419 68Q419 43 426 35T447 26Q469 29 482 57T512 145Q514 153 532 153Q551 153 551 144Q550 139 549 130T540 98T523 55T498 17T462 -8Q454 -10 438 -10Q372 -10 347 46Q345 45 336 36T318 21T296 6T267 -6T233 -11Q189 -11 155 7Q103 38 103 113Q103 170 138 262T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Z"></path><path stroke-width="0" id="E4-MJMATHI-59" d="M66 637Q54 637 49 637T39 638T32 641T30 647T33 664T42 682Q44 683 56 683Q104 680 165 680Q288 680 306 683H316Q322 677 322 674T320 656Q316 643 310 637H298Q242 637 242 624Q242 619 292 477T343 333L346 336Q350 340 358 349T379 373T411 410T454 461Q546 568 561 587T577 618Q577 634 545 637Q528 637 528 647Q528 649 530 661Q533 676 535 679T549 683Q551 683 578 682T657 680Q684 680 713 681T746 682Q763 682 763 673Q763 669 760 657T755 643Q753 637 734 637Q662 632 617 587Q608 578 477 424L348 273L322 169Q295 62 295 57Q295 46 363 46Q379 46 384 45T390 35Q390 33 388 23Q384 6 382 4T366 1Q361 1 324 1T232 2Q170 2 138 2T102 1Q84 1 84 9Q84 14 87 24Q88 27 89 30T90 35T91 39T93 42T96 44T101 45T107 45T116 46T129 46Q168 47 180 50T198 63Q201 68 227 171L252 274L129 623Q128 624 127 625T125 627T122 629T118 631T113 633T105 634T96 635T83 636T66 637Z"></path><path stroke-width="0" id="E4-MJMAIN-30" d="M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z"></path><path stroke-width="0" id="E4-MJMATHI-76" d="M173 380Q173 405 154 405Q130 405 104 376T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Q21 294 29 316T53 368T97 419T160 441Q202 441 225 417T249 361Q249 344 246 335Q246 329 231 291T200 202T182 113Q182 86 187 69Q200 26 250 26Q287 26 319 60T369 139T398 222T409 277Q409 300 401 317T383 343T365 361T357 383Q357 405 376 424T417 443Q436 443 451 425T467 367Q467 340 455 284T418 159T347 40T241 -11Q177 -11 139 22Q102 54 102 117Q102 148 110 181T151 298Q173 362 173 380Z"></path><path stroke-width="0" id="E4-MJMAIN-2223" d="M139 -249H137Q125 -249 119 -235V251L120 737Q130 750 139 750Q152 750 159 735V-235Q151 -249 141 -249H139Z"></path></defs><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="matrix(1 0 0 -1 0 0)"><g transform="translate(69566,0)"><g id="mjx-eqn-1"><use xlink:href="#E4-MJMAIN-28"></use><use xlink:href="#E4-MJMAIN-31" x="389" y="0"></use><use xlink:href="#E4-MJMAIN-29" x="889" y="0"></use></g></g><g transform="translate(29922,0)"><g transform="translate(-15,0)"><use xlink:href="#E4-MJMAINB-56" x="0" y="0"></use><use transform="scale(0.707)" xlink:href="#E4-MJMAIN-31" x="1228" y="-213"></use><use xlink:href="#E4-MJMAIN-D7" x="1544" y="0"></use><g transform="translate(2544,0)"><use xlink:href="#E4-MJMAINB-56" x="0" y="0"></use><use transform="scale(0.707)" xlink:href="#E4-MJMAIN-32" x="1228" y="-213"></use></g><use xlink:href="#E4-MJMAIN-3D" x="4145" y="0"></use><g transform="translate(5201,0)"><g transform="translate(0,2508)"><use xlink:href="#E4-MJMAIN-2223" x="0" y="-750"></use><g transform="translate(0,-2915.630179772682) scale(1,2.6221735730302425)"><use xlink:href="#E4-MJMAIN-2223"></use></g><use xlink:href="#E4-MJMAIN-2223" x="0" y="-4269"></use></g><g transform="translate(445,0)"><g transform="translate(-15,0)"><use xlink:href="#E4-MJMAINB-69" x="522" y="1708"></use><g transform="translate(0,179)"><g transform="translate(120,0)"><rect stroke="none" width="1123" height="60" x="0" y="220"></rect><g transform="translate(60,423)"><use transform="scale(0.707)" xlink:href="#E4-MJMAIN-2202" x="0" y="0"></use><use transform="scale(0.707)" xlink:href="#E4-MJMATHI-58" x="567" y="0"></use></g><g transform="translate(158,-414)"><use transform="scale(0.707)" xlink:href="#E4-MJMAIN-2202" x="0" y="0"></use><use transform="scale(0.707)" xlink:href="#E4-MJMATHI-75" x="567" y="0"></use></g></g></g><g transform="translate(0,-1580)"><g transform="translate(120,0)"><rect stroke="none" width="1123" height="60" x="0" y="220"></rect><g transform="translate(60,423)"><use transform="scale(0.707)" xlink:href="#E4-MJMAIN-2202" x="0" y="0"></use><use transform="scale(0.707)" xlink:href="#E4-MJMATHI-58" x="567" y="0"></use></g><g transform="translate(189,-414)"><use transform="scale(0.707)" xlink:href="#E4-MJMAIN-2202" x="0" y="0"></use><use transform="scale(0.707)" xlink:href="#E4-MJMATHI-76" x="567" y="0"></use></g></g></g></g><g transform="translate(2349,0)"><use xlink:href="#E4-MJMAINB-6A" x="474" y="1708"></use><g transform="translate(0,179)"><g transform="translate(120,0)"><rect stroke="none" width="1060" height="60" x="0" y="220"></rect><g transform="translate(60,423)"><use transform="scale(0.707)" xlink:href="#E4-MJMAIN-2202" x="0" y="0"></use><use transform="scale(0.707)" xlink:href="#E4-MJMATHI-59" x="567" y="0"></use></g><g transform="translate(127,-414)"><use transform="scale(0.707)" xlink:href="#E4-MJMAIN-2202" x="0" y="0"></use><use transform="scale(0.707)" xlink:href="#E4-MJMATHI-75" x="567" y="0"></use></g></g></g><g transform="translate(0,-1580)"><g transform="translate(120,0)"><rect stroke="none" width="1060" height="60" x="0" y="220"></rect><g transform="translate(60,423)"><use transform="scale(0.707)" xlink:href="#E4-MJMAIN-2202" x="0" y="0"></use><use transform="scale(0.707)" xlink:href="#E4-MJMATHI-59" x="567" y="0"></use></g><g transform="translate(158,-414)"><use transform="scale(0.707)" xlink:href="#E4-MJMAIN-2202" x="0" y="0"></use><use transform="scale(0.707)" xlink:href="#E4-MJMATHI-76" x="567" y="0"></use></g></g></g></g><g transform="translate(4649,0)"><use xlink:href="#E4-MJMAINB-6B" x="0" y="1708"></use><use xlink:href="#E4-MJMAIN-30" x="53" y="179"></use><use xlink:href="#E4-MJMAIN-30" x="53" y="-1580"></use></g></g><g transform="translate(5868,2508)"><use xlink:href="#E4-MJMAIN-2223" x="0" y="-750"></use><g transform="translate(0,-2915.630179772682) scale(1,2.6221735730302425)"><use xlink:href="#E4-MJMAIN-2223"></use></g><use xlink:href="#E4-MJMAIN-2223" x="0" y="-4269"></use></g></g></g></g></g></svg></span></div><script type="math/tex; mode=display" id="MathJax-Element-3">\mathbf{V}_1 \times \mathbf{V}_2 =  \begin{vmatrix} 
\mathbf{i} & \mathbf{j} & \mathbf{k} \\
\frac{\partial X}{\partial u} &  \frac{\partial Y}{\partial u} & 0 \\
\frac{\partial X}{\partial v} &  \frac{\partial Y}{\partial v} & 0 \\
\end{vmatrix}</script></div></div><h3><a name="打印样式适配" class="md-header-anchor"></a><span>打印样式适配</span></h3><p><span>使用 VLOOK™ 提供的定制打印功能，可以在打印输出时自动优化页面排版和样式，以适应用打印输出。</span></p><h3><a name="快捷键操作" class="md-header-anchor"></a><span>快捷键操作</span></h3><p><span>![全局快捷键]</span></p><figure><table><thead><tr><th style='text-align:center;' ><span>快捷键</span></th><th><span>功能</span></th></tr></thead><tbody><tr><td style='text-align:center;' ><kbd><span>D</span></kbd></td><td><span>开启 / 关闭 Dark 模式</span></td></tr><tr><td style='text-align:center;' ><kbd><span>O</span></kbd></td><td><span>显示 / 隐藏大纲面板</span></td></tr><tr><td style='text-align:center;' ><kbd><span>A</span></kbd></td><td><span>切换字体样式，详见</span><a href='#字体风格选择'><span>字体风格选择</span></a></td></tr><tr><td style='text-align:center;' ><kbd><span>I</span></kbd></td><td><span>显示 / 隐藏插图导航</span></td></tr><tr><td style='text-align:center;' ><kbd><span>P</span></kbd></td><td><span>打印文档</span></td></tr><tr><td style='text-align:center;' ><kbd><span>S</span></kbd></td><td><span>打开 / 关闭聚光灯</span></td></tr><tr><td style='text-align:center;' ><kbd><span>←</span></kbd><span> 或 </span><kbd><span>&lt;</span></kbd></td><td><span>上一章</span></td></tr><tr><td style='text-align:center;' ><kbd><span>→</span></kbd><span> 或 </span><kbd><span>&gt;</span></kbd></td><td><span>下一章</span></td></tr><tr><td style='text-align:center;' ><kbd><span>J</span></kbd><kbd><span>K</span></kbd><kbd><span>H</span></kbd><kbd><span>L</span></kbd></td><td><span>内容块浏览操作，详见</span><a href='#逐段导航'><span>逐段导航</span></a></td></tr><tr><td style='text-align:center;' ><kbd><span>ESC</span></kbd></td><td><span>关闭弹出的界面、聚光灯、内容块聚焦等</span></td></tr></tbody></table></figure><p><span>![插图导航快捷键]&quot;注：打开插图导航后生效&quot;</span></p><figure><table><thead><tr><th style='text-align:center;' ><span>快捷键</span></th><th><span>功能</span></th></tr></thead><tbody><tr><td style='text-align:center;' ><kbd><span>←</span></kbd><span> / </span><kbd><span>&lt;</span></kbd></td><td><span>前一张插图</span></td></tr><tr><td style='text-align:center;' ><kbd><span>→</span></kbd><span> / </span><kbd><span>&gt;</span></kbd></td><td><span>后一张插图</span></td></tr></tbody></table></figure><p><span>![聚光灯快捷键]&quot;注：打开聚光灯后生效&quot;</span></p><figure><table><thead><tr><th style='text-align:center;' ><span>快捷键</span></th><th><span>功能</span></th></tr></thead><tbody><tr><td style='text-align:center;' ><kbd><span>⇧ Shift</span></kbd></td><td><span>调整聚光灯大小</span></td></tr></tbody></table></figure><h1><a name="打赏" class="md-header-anchor"></a><span>打赏</span></h1><p><strong><span>若喜欢 VLOOK™ 的话，可以请 Max 喝杯咖啡～</span></strong></p><p><img src="https://s1.ax1x.com/2020/04/14/GzVBHe.png" referrerpolicy="no-referrer"></p><h1><a name="如何使用" class="md-header-anchor"></a><span>如何使用</span></h1><h2><a name="第1步下载配置" class="md-header-anchor"></a><span>第1步：下载、配置</span></h2><ul><li><p><span>访问 VLOOK™ 官方主页下载最新发布版本：</span><a href='https://github.com/MadMaxChow/VLOOK/releases'><span>https://github.com/MadMaxChow/VLOOK/releases</span></a></p></li><li><p><span>下载并安装 </span><a href='https://www.typora.io'><span>Typora</span></a><span> ，启动后进入「偏好设置」，启用一些建议的选项，详细如下图：</span>
<img src="https://s1.ax1x.com/2020/04/14/GzmKjP.png?invert=in-dark" referrerpolicy="no-referrer" alt="开启「Markdown 扩展语法」下的所有选项"></p><p>&nbsp;</p><p><img src="https://s1.ax1x.com/2020/04/14/GzmQnf.png?invert=in-dark" referrerpolicy="no-referrer" alt="开启「代码块」「公式」下的所有选项"></p></li></ul><h2><a name="第2步应用主题" class="md-header-anchor"></a><span>第2步：应用主题</span></h2><ul><li><span>将</span><code>released\theme</code><span>下所有 CSS 文件复制至 Typora 的主题目录（ Typora「偏好设置」中点击「外观 - 打开主题目录」定位到该目录）；</span></li><li><span>重启 Typora ，点击菜单</span><code>主题</code><span>，选择以</span><code>vlook-*</code><span>形式命名的主题，即可启用对应的 VLOOK™ 主题样式；</span></li><li><span>可基于</span><code>released</code><span>下的</span><code>文档模板-Template.md</code><span> 为模板来创建你自己的 Markdown 文档。</span></li></ul><h2><a name="第3步植入插件" class="md-header-anchor"></a><span>第3步：植入插件</span></h2><ul><li><p><span>在 Typora 中将 Markdown 文件导出为</span><code>HTML</code><span>文件；</span></p></li><li><p><span>打开文件</span><code>released\VLOOK-plugin-for-Typora.txt</code><span>，全选所有内容，并复制；</span></p></li><li><p><span>用纯文件编辑器，如：记事本、</span><a href='https://code.visualstudio.com/'><span>Visual Studio Code</span></a><span>，打开该导出的 HTML 文件；</span></p></li><li><p><span>搜索「</span><strong><span>&lt;body </span></strong><span>」，并将复制的内容粘贴到 body 标签的关闭符「</span><strong><span>&gt;</span></strong><span>」之后：</span></p><pre spellcheck="false" class="md-fences md-end-block md-fences-with-lineno ty-contain-cm modeLoaded" lang=""><div class="CodeMirror cm-s-inner CodeMirror-wrap" lang=""><div style="overflow: hidden; position: relative; width: 3px; height: 0px; top: 0px; left: 38px;"><textarea autocorrect="off" autocapitalize="off" spellcheck="false" tabindex="0" style="position: absolute; bottom: -1em; padding: 0px; width: 1000px; height: 1em; outline: none;"></textarea></div><div class="CodeMirror-scrollbar-filler" cm-not-content="true"></div><div class="CodeMirror-gutter-filler" cm-not-content="true"></div><div class="CodeMirror-scroll" tabindex="-1"><div class="CodeMirror-sizer" style="margin-left: 28px; margin-bottom: 0px; border-right-width: 0px; padding-right: 0px; padding-bottom: 0px;"><div style="position: relative; top: 0px;"><div class="CodeMirror-lines" role="presentation"><div role="presentation" style="position: relative; outline: none;"><div class="CodeMirror-measure"><div class="CodeMirror-linenumber CodeMirror-gutter-elt"><div>4</div></div></div><div class="CodeMirror-measure"></div><div style="position: relative; z-index: 1;"></div><div class="CodeMirror-code" role="presentation"><div class="CodeMirror-activeline" style="position: relative;"><div class="CodeMirror-activeline-background CodeMirror-linebackground"></div><div class="CodeMirror-gutter-background CodeMirror-activeline-gutter" style="left: -28px; width: 28px;"></div><div class="CodeMirror-gutter-wrapper CodeMirror-activeline-gutter" style="left: -28px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt CodeMirror-linenumber-show" style="left: 0px; width: 19px;">1</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;">&lt;body ...&gt;</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -28px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 19px;">2</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;">← ← ← ← ← 将「VLOOK-plugin-for-Typora.txt」文件的内容粘贴于此！</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -28px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt" style="left: 0px; width: 19px;">3</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;">...</span></pre></div><div style="position: relative;"><div class="CodeMirror-gutter-wrapper" style="left: -28px;"><div class="CodeMirror-linenumber CodeMirror-gutter-elt CodeMirror-linenumber-show" style="left: 0px; width: 19px;">4</div></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;">&lt;/body&gt;</span></pre></div></div></div></div></div></div><div style="position: absolute; height: 0px; width: 1px; border-bottom-width: 0px; border-bottom-style: solid; border-bottom-color: transparent; top: 112px;"></div><div class="CodeMirror-gutters" style="height: 112px; left: 0px;"><div class="CodeMirror-gutter CodeMirror-linenumbers" style="width: 27px;"></div></div></div></div></pre></li><li><p><span>保存，大吉大利。</span></p></li></ul><blockquote><p><span>强烈建议使用 Chrome、Firefox、Edge 浏览器访问</span></p></blockquote><h1><a name="许可协议" class="md-header-anchor"></a><span>许可协议</span></h1><p><strong><span>MIT许可证</span></strong></p><p><span>版权所有 (c) 2018-2020 MAX°DESIGN | Max Chow</span></p><p><span>在此授予任何获得此软件和相关文档文件（“软件”）副本的人免费许可，以无限制地处理本软件，包括但不限于使用，复制，修改，合并，发布，分发，再授权和/或出售本软件的副本，并允许本软件的授予人员遵从以下情况：</span></p><p><span>上述版权声明和本许可声明应包含在本软件的所有副本或重要部分中。</span></p><p><span>本软件按“原样”提供，不提供任何以表达或暗示，包括但不限于销售，适用于特定用途和不侵权的保证。在任何情况下，作者或版权所有人不对因软件或软件的使用或其他事宜产生的任何索赔，损害或其他责任（无论是在合同，侵权或其他方面的诉讼中）负责。</span></p><h6><a name="the-end" class="md-header-anchor"></a><span>The End</span></h6><div class='footnotes-area'  ><hr/>
<div class='footnote-line'><span class='md-fn-count'>1</span> <span>Typora 是非常棒的跨平台的 Markdown 编辑器，支持直接预览与编辑，更详细的特性详见</span><a href='https://www.typora.io'><span>官网</span></a><span>。</span> <a name='dfref-footnote-1' href='#ref-footnote-1' title='back to document' class='reversefootnote' >↩</a></div>
<div class='footnote-line'><span class='md-fn-count'>2</span> <span>可以根据源码目录下  LESS 文件为样例进行自定义扩展，访问 VLOOK™ 的 </span><a href='http://github.com/madmaxchow/vlook'><span>github 主页</span></a><span>了解更多。</span> <a name='dfref-footnote-2' href='#ref-footnote-2' title='back to document' class='reversefootnote' >↩</a></div>
<div class='footnote-line'><span class='md-fn-count'>3</span> <span>mermaid 是一个用于画流程图、状态图、顺序图、甘特图的库，使用 JS 进行本地渲染，广泛集成于许多 Markdown 编辑器中。详见 </span><a href='https://mermaidjs.github.io'><span>mermaid官网</span></a><span>，或 VLOOK™ 的示例文档《</span><a href='https://madmaxchow.github.io/VLOOK/chart.html'><span>脚本化图表 for Markdown</span></a><span>》</span> <a name='dfref-footnote-3' href='#ref-footnote-3' title='back to document' class='reversefootnote' >↩</a></div>
<div class='footnote-line'><span class='md-fn-count'>4</span> <span>flowchart.js 基于 SVG 的流程图插件，它仅需几行代码即可在 Web 上完成流程图的构建。可以从文字表述中画出简单的 SVG 流程图，也可以画出彩色的图表。详见 </span><a href='http://flowchart.js.org'><span>flowchart.js 官网</span></a><span>，或 VLOOK™ 的示例文档《</span><a href='https://madmaxchow.github.io/VLOOK/chart.html'><span>脚本化图表 for Markdown</span></a><span>》。</span> <a name='dfref-footnote-4' href='#ref-footnote-4' title='back to document' class='reversefootnote' >↩</a></div>
<div class='footnote-line'><span class='md-fn-count'>5</span> <span>JS sequence diagrams 是一个方便建立UML的顺序图（序列图or循序图）在线工具，使用简单。详见 </span><a href='https://bramp.github.io/js-sequence-diagrams/'><span>JS Sequence Diagrams</span></a><span> 官网，或 VLOOK™ 的示例文档《</span><a href='https://madmaxchow.github.io/VLOOK/chart.html'><span>脚本化图表 for Markdown</span></a><span>》。</span> <a name='dfref-footnote-5' href='#ref-footnote-5' title='back to document' class='reversefootnote' >↩</a></div>
<div class='footnote-line'><span class='md-fn-count'>6</span> <span>这是 VLOOK™ 优化后的脚的信息</span> <a name='dfref-footnote-6' href='#ref-footnote-6' title='back to document' class='reversefootnote' >↩</a></div></div></div>
</body>
</html>